2012-06-26 6 views
9

だから私はC#を初めて使っていて、理解するのが難しいですoutです。ただ機能C#outパラメーターvs返す

using System; 
class ReturnTest 
{ 
    static double CalculateArea() 
    { 
     double r=5; 
     double area = r * r * Math.PI; 
     return area; 
    } 

    static void Main() 
    { 
     double output = CalculateArea(); 
     Console.WriteLine("The area is {0:0.00}", output); 
    } 
} 

から何かを返すとは対照的に、私はそれを一般的にどうなるか最初のものがある。この

using System; 
class ReturnTest 
{ 
    static void CalculateArea(out double r) 
    { 
     r=5; 
     r= r * r * Math.PI; 
    } 

    static void Main() 
    { 
     double radius; 
     CalculateArea(out radius); 
     Console.WriteLine("The area is {0:0.00}",radius); 
     Console.ReadLine(); 
    } 
} 

と比較します。 return文の代わりにoutを使用する理由がありますか?私はrefが双方向通信を可能にしていることを理解しています。また、関数が変数を使って何かを送信していない限り、私は通常refを使用すべきではありません。上に示したように

しかしアウトと返す文の違いは、ありますか?文法的には、どちらかを好む理由がありますか?一つの変数が出て心配して復帰さ

+8

研究 'Dictionary.TryGetValue'と' int.TryParse'及びこれらの例はout' 'の有用性を説明するかどうかを確認します。 –

+3

'out'は、メソッドから無関係な複数の値を返す必要があるときに、ほとんど使用されます。また、COMまたはp/invokeを介してネイティブコードと相互作用するときにポインタをシミュレートするためによく使用されます。 – dlev

+1

C/C++にはポインタがあります。ポインタを関数に渡すと、関数内でポインタを変更することができ、値も呼び出し関数で変更されます。アウトはほとんど同じことをします。 – carny666

答えて

13

returnの代わりにoutを使用すると、特定のAPIで表示されるTryのパターン(例:Int32.TryParse(...))が得られます。このパターンでは、戻り値は(例外ではなく)操作の成功または失敗を通知するために使用され、outパラメータが実際の結果を返すために使用されます。例外が回避されるので

Int32.Parseに対する利点の一つは、速度です。 Parsing Performance (If, TryParse, Try-Catch)

1

はOKです。しかし、もしあなたが1つ以上の値を返そうとしたらどうでしょうか?それにはOutが役立ちます。

static void CalculateArea(out double r, out double Foo) 
{ 
    //Can return 2 values in terms of out variables. 
} 

static double CalculateArea(double r) 
{ 
    // Will return only one value. 
} 
2

複数の値を返す必要がある場合は、戻り値の特別なクラスを作成するよりも簡単です。

+0

カントは、私はdidntの信じます私は、パフォーマンスの違い(もしあれば)についても、思ったんだけど、このおかげで –

4

私がoutを使う傾向があるのは、単一の方法から複数のものが返される必要があるときだけです。 Outを使用すると、複数のオブジェクトをクラスにラップすることを避けることができます。 Microsoft Out pageの例をご覧ください。あなたがオブジェクトの値をラップすることなく、メソッドから複数の値を返すようにしたいとき

8

outキーワードが主に使用されています。

例は、戻り値(試行の成功を表すブール値)と、解析が成功した場合に値を取得するパラメータoutの両方を持つInt32.TryParseメソッドです。

方法は、ブール値と整数の両方を含んでいたオブジェクトを返すことができ、それは方法の性能を低下させる、ヒープ上に作成されるオブジェクトのために必要であろう。

+0

考えます。 C++環境から来ているのは、値で返されたオブジェクトをコピーする方がコストがかかるということです。これはC#でも当てはまりますか?私はあなたが関数内でブランドの新しい大規模なオブジェクトを構築し、それを返す場合、それはあなたがに割り当てる何にコピーされます意味ですか?オブジェクトを作成してoutキーワードで変更するのではなく、これはC#では無関係ですか? – Reasurria

+0

@Reasurria:あなたがオブジェクトを作成し、それを返す場合、それが返され、参照のみだが、オブジェクトが複製されていません。あなたがそれらを特異的に複製する場合、.NETでのオブジェクトが唯一の新しいコピーを作成しません周りのオブジェクトを渡して、クローン化されます。 – Guffa

+0

おかげで私は、この点に注意しておこう。 – Reasurria

関連する問題