2017-05-10 3 views
-2

Hey Guys!TryParse()メソッドの出力パラメータとしてC#キーワード "out"

私はTryParse()出力パラメータを使用する必要がありますなぜ私は、知りたい - 私たちはそれを使用する理由は私のためにそれが明確でないため、方法。例えば

int number; 
if (int.TryParse("2", out number)) 
    Console.WriteLine("The parse worked!"); 
else 
    Console.WriteLine("The parse didn't work!"); 
} 

短い:

int.TryParse("2", out int number) 

私はあなたが私を助けて、あなたが私にいくつかの大きなヒントを与えることができることを願って!

+4

オム:あなたはこれを行うことができますか?あなたが求めていることは本当にはっきりしません。 2番目のフォームはC#7で有効です。 –

+0

なぜですか? 'TryParse'は2番目のパラメータを' out'パラメータとして定義されているので、それを呼び出すには渡された引数に 'out'修飾子を使わなければなりません。 – DigiFriend

+0

しかし私にとっては、このパラメータを使用する必要がある理由は明らかではありません**。 –

答えて

0

なぜoutのキーワードが必要なのですか。あなたはパラメータを持つメソッドを呼び出すとき

は通常、この方法は、これらの変数のそれ自身のコピーを取得します - スタック上のバイトのカップルは方法のために予約されています。メソッドが終了に達すると、それらのバイトをすべて解放します。したがって、そこに格納された値はすべて失われます。 outキーワードは、呼び出し元が使用できるように、そのパラメーターの値を保持するようにコンパイラーに指示します。内部的には、呼び出し元メソッドにある元の変数への参照が渡されるため、更新は呼び出し元の変数を実際に更新するため、失われることはありません。

OPはコメントで指摘しています。outrefキーワードと似ていますが、refを使用する場合は無視されますが、outには値を割り当ててから戻す必要があります。

+0

キーワード 'ref'と同じですが、キーワード' out'はメソッドが終了する前に値を取得する必要があります。そうですか? –

+0

@RafaelFarcherそうです、私はそれを答えに加えます、ありがとう – MotKohn

0

TryParseはすでに結果としてブール値を返すので、outパラメータを使用する必要があります。したがって、値も返されません。

実際のoutキーワードは単に参照によって変数を渡しますが、これは関数が現在の値を使用するのではなく、その変数に値を割り当てることができるということです。

私は、これはあなたが求めていたものだと思いますが、あなたが何かに実際の明確化が必要な場合、私に知らせて:)

+1

C#7では、複数の値を返すことができます。 OPにはC#7のコードが含まれているので、これがどのように適用されるか、または適用されないかを明確にするのはいいかもしれません。 – Enigmativity

0

メソッド名TryParseはそのが解析しようとしている意味するのでとして。 最初のパラメータをint型に解析できない場合は、falseの値とデフォルト値0のoutパラメータが返されます。 文字列をint型に解析できるかどうかは予測できません。outパラメータは便利です。

私は答えました。

0

"Out"キーワードチェックは基本的にオーバーフローチェックに使用されます。 TryParseメソッドは、ケース2の供給された整数値が整数32ビット境界(Int32で指定された最小値と最大値のようなもの)の境界外にあることを保証します。

私は、キーワードが変換成功かどうかを文字列 "2"か他の値から判断することができます。

実際の値は「2」が成功し、0-不成功です。このチェックを行うことで、境界条件が満たされていることを保証し、実行時オーバーフロー例外に終わることはありません。

+2

これは 'out'キーワードとは異なります。これが 'TryParse'メソッドの動作です。 – MotKohn

1

outパラメータなし、TryParse整数の値を受信するが、コールを行うメソッドで変数の値を変更することができないだろう。この場合

int number; 
if (int.TryParse("2", out number)) 

に意図はTryParse方法にnumberを渡すが、numberの値を変更するだけではありません。 outパラメータがないと、numberの値は決して変更されません。関数の唯一の使用は、数値が解析できるかどうかを調べることであるため、関数の名前もCanParseになる可能性があります。

この動作により、2回解析される値の評価を避けることができます。そうでなければ、このようなことをしなければならないかもしれません。

var s = "5"; 
int x; 
if(int.CanParse(s)) //not a real function 
{ 
    x = int.Parse(s); 
} 

あなたは本当に二回文字列を解析されるだろう - それはintとして解析することが可能かどうかを確認するために、そして再度解析された値を取得するために一度。

最初にoutという変数を宣言しなければならないという副作用があります。これは小さな迷惑です。 C#7ではそれをする必要はありません。 `int.TryParse` *の2番目のパラメータが*` out`パラメータであるので、

if(int.TryParse(out var x)) 
関連する問題