2011-11-23 7 views
13

可能性の重複:
Does Dispose method still get called when Exception is thrown inside of Using statment?使用ブロックで例外がスローされた場合でもリソースは廃棄されますか?

データベースにアクセスするとき、私は、usingブロックの数を持っています。私は疑問を抱いていました - ブロックを使用しているブロック内に例外がスローされなければならない場合、ブロックの終わりに達していなくても必要なリソースがまだ処分されるでしょうか?または、catchブロックで手動で閉じる必要がありますか?

答えて

26

usingステートメントで定義されたリソースが破棄されました。これがusingの主な理由です。

usingステートメントは、廃棄を使用すると、オブジェクトのメソッドを呼び出している間 例外が発生した場合でもと呼ばれていることを保証します。 はtryブロック内にオブジェクトを入れ、finallyブロックで を呼び出して同じ結果を得ることができます。実際には、これは usingステートメントがコンパイラによってどのように翻訳されるかです。
http://msdn.microsoft.com/en-us/library/yh598w02%28v=VS.100%29.aspx

+1

+1は説明とのリンクで15秒です。私よりも速い。 ;-) – Fischermaen

+0

ありがとう!ちょうど答えを受け入れるためにタイマーを待って:) –

+0

と私は-1を取得しながら... – Fischermaen

1

はい、使用ブロックのリソースが配置されます。

1

あなたはそうではありません。実際にはusingブロックは、try{}catch{}finally{}構造を使用してfinallyブロックにDisposeメソッド呼び出しを使用した場合と同じです。とにかく呼び出されます。

1

が翻訳されているのブロックの一部であるため、この要素は廃棄されます。 C#の仕様の8.13から

使用して文を三つの部分に翻訳されています取得、使用、 および処分。リソースの使用は、finally節を含むtry ステートメントに暗黙的に囲まれています。このfinally節は、リソースの を廃棄します。 nullリソースが取得された場合は、 Disposeへの呼び出しは行われず、例外はスローされません。

したがって、手動で処理する必要はありません。この場合は、自分のcatchブロックがどこにあるのかわかりません。

関連する問題