web-dev-qa-db-ja.com

nullオブジェクトでステートメントを使用する

(潜在的に)nullオブジェクトでusingステートメントを使用しても安全ですか?
次の例を検討してください。

class Test {
    IDisposable GetObject(string name) {
        // returns null if not found
    }

    void DoSomething() {
        using (IDisposable x = GetObject("invalid name")) {
            if (x != null) {
                 // etc...
            }
        }
    }
}

オブジェクトがnullでない場合にのみDisposeが呼び出され、NullReferenceExceptionを取得しないことが保証されていますか?

163
Paolo Tedesco

はい、Dispose()はnull以外のオブジェクトでのみ呼び出されます。

http://msdn.Microsoft.com/en-us/library/yh598w02.aspx

156
reko_t

usingの展開では、nullを呼び出す前に、オブジェクトがDisposeではないことを確認します。したがって、安全です。

あなたの場合、次のようなものが得られます:

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}
30
João Angelo

大丈夫です:

using ((IDisposable)null) { }

ここで例外はスローされません。

補足:例外がスローされるforeachおよびIEnumerableと間違えないでください。

13
Darin Dimitrov

はい、参照を破棄する前にnullチェックが行われます。 Reflectorでコードを表示して、自分自身を調べることができます。

1
oli