2011-01-27 10 views
3

プロジェクトの作業中に、C#について実際にわからないことがあることがわかりました。変数(既定値で既に初期化されている)に値を代入し、その値が別のメソッドによって作成された場合、他のメソッドで例外が発生した場合はどうなりますか。明確にするため、ここでは例:Enum.Parseが値解析できない場合はどうなり変数を代入するときの例外処理C#

eType = defaultvalue; 
... 
eType = (EReaderType)Enum.Parse(typeof(EReaderType), tXmlNode.InnerText, true); 

(XMLでは文字列、ここでは重要でないが...)と、例外がスローされますか? eTypeはデフォルト値を保持するか、それとも何か他のものによって再割り当てされますか(ヌルか定義されていないblabla)?これまでのところ、私のテストは古い価値を維持することを示しています。しかし、これがいつもうまくいくのか、それが偶然だったのかは分かりません。簡単に言えば、私はC#がこのようなことをどのように処理するのか分かりません。

編集:[OK]を、多くのすべての答え:)

答えて

7

それについて推論するための正しい方法は次のとおりです。部分式

  • 副作用は右に左から実行されています。
  • の副作用は、優先順位で実行されます。

あなたが持っていると仮定します。

M().x = N(P()).Q(); // x is a variable 

物事が起こる順序は次のとおりです。

  • Mは()
  • 実行されたxの場所は
  • P(決定されます)が実行される
  • N()が実行される
  • Qは、()
  • を実行するものの一つが、その後、例外が実行されることはありません後に起こるすべての例外をスローする場合のxへの代入は

が起きています。

16

ためのおかげであなたは構文解析が成功するかどうかわからない場合は、代わりにEnum.TryParseを使用することを検討してください。

しかし、あなたの例では、右辺は完全に評価されてから代入が行われるため、右辺を処理している間は例外が割り当てられません。

2

変数は、それが私の知る限りとして(この場合、文字列を解析する)、その値を計算する過程

1

を例外をスローするので、操作が習慣行うこと実際ETYPE =(計算値)、その古い値を維持します2番目の割り当て時に例外をスローすることになります。最終的には新しい値を保存しないで、古い値を保持します。

2

の手順で扱います。が考えられます。

お持ちの場合:

var x = SomeOperation(); 

これは何が起こるかです:

  1. SomeOperation実行します。
  2. 戻り値はxに割り当てられます。

SomeOperationに例外がスローされた場合、上記の手順1は完了しません。つまり、ステップ2には至っていません。

これは私が知る限り、確実に確定的なイベントの順序です。だから、xに突然何か予測不可能な値が割り当てられることを心配する必要はありません。