32

using戻り値がある場合や内部で例外がスローされた場合でも、ステートメントは常にオブジェクトを破棄しますか? いいえ:

using (var myClassInstance = new MyClass())
{
    // ...
    return;
}

また

using (var myClassInstance = new MyClass())
{
    // ...
    throw new UnexplainedAndAnnoyingException();
}
4

3 に答える 3

41

はい、それが要点です。コンパイルすると次のようになります。

SomeDisposableType obj = new SomeDisposableType();
try
{
    // use obj
}
finally
{
    if (obj != null) 
        ((IDisposable)obj).Dispose();
}

ここでは用語に注意してください。オブジェクト自体は割り当て解除されません。メソッドが呼び出されDispose()、通常、アンマネージ リソースが解放されます。

于 2013-06-28T04:38:21.623 に答える
11

いいえ、そうではありません。

しかし、それは声明のせいではありません。usingこれは、finallyブロックが CLR によってどのように処理されるかによるものです。finallyブロックが実行されない場合があります。未処理の例外があり、CLRより多くのコードを実行するとより多くのエラーが発生すると判断した場合、CLR はメソッドを実行しません (メソッドがコンパイルされたブロックをDispose実行しないためです)。したがって、細心の注意を払い、メソッドの実行に人生を費やさないようにしてください。finallyDisposeDispose

Disposeメソッドが実行されない原因となるその他のケースは、次のとおりです。

于 2018-07-13T08:47:10.850 に答える
10

オブジェクトが IDisposable を実装している場合、それが呼び出されます。

MSDN の using Statement (C# リファレンス) から

1 つまたは複数のオブジェクトが破棄される範囲外のスコープを定義します。

using ステートメントを使用すると、プログラマは、リソースを使用するオブジェクトがそれらを解放するタイミングを指定できます。using ステートメントに提供されるオブジェクトは、IDisposable インターフェイスを実装する必要があります。このインターフェイスは、オブジェクトのリソースを解放する Dispose メソッドを提供します。

于 2013-06-28T04:38:19.657 に答える