using
戻り値がある場合や内部で例外がスローされた場合でも、ステートメントは常にオブジェクトを破棄しますか? いいえ:
using (var myClassInstance = new MyClass())
{
// ...
return;
}
また
using (var myClassInstance = new MyClass())
{
// ...
throw new UnexplainedAndAnnoyingException();
}
using
戻り値がある場合や内部で例外がスローされた場合でも、ステートメントは常にオブジェクトを破棄しますか? いいえ:
using (var myClassInstance = new MyClass())
{
// ...
return;
}
また
using (var myClassInstance = new MyClass())
{
// ...
throw new UnexplainedAndAnnoyingException();
}
はい、それが要点です。コンパイルすると次のようになります。
SomeDisposableType obj = new SomeDisposableType();
try
{
// use obj
}
finally
{
if (obj != null)
((IDisposable)obj).Dispose();
}
ここでは用語に注意してください。オブジェクト自体は割り当て解除されません。メソッドが呼び出されDispose()
、通常、アンマネージ リソースが解放されます。
いいえ、そうではありません。
しかし、それは声明のせいではありません。using
これは、finally
ブロックが CLR によってどのように処理されるかによるものです。finally
ブロックが実行されない場合があります。未処理の例外があり、CLRがより多くのコードを実行するとより多くのエラーが発生すると判断した場合、CLR はメソッドを実行しません (メソッドがコンパイルされたブロックをDispose
実行しないためです)。したがって、細心の注意を払い、メソッドの実行に人生を費やさないようにしてください。finally
Dispose
Dispose
Dispose
メソッドが実行されない原因となるその他のケースは、次のとおりです。
OutOfMemoryException
とStackOverflowException
プロセスの強制終了
電力損失
オブジェクトが IDisposable を実装している場合、それが呼び出されます。
MSDN の using Statement (C# リファレンス) から
1 つまたは複数のオブジェクトが破棄される範囲外のスコープを定義します。
using ステートメントを使用すると、プログラマは、リソースを使用するオブジェクトがそれらを解放するタイミングを指定できます。using ステートメントに提供されるオブジェクトは、IDisposable インターフェイスを実装する必要があります。このインターフェイスは、オブジェクトのリソースを解放する Dispose メソッドを提供します。