Dispose()は、nullオブジェクトのusingステートメントで呼び出されますか?


179

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

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

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

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


回答:


172

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

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


30
変数がnullの場合でも、usingブロックが実行されます。最初にnullチェックを行わずにusingブロック内で変数を参照すると、NullReferenceExceptionが発生します。誤解を防ぐために、この回答には「はい、Dispose()null以外のオブジェクトでのみ呼び出されます」と記載する必要があります。
2011年

37

の展開はusing、オブジェクトがnull呼び出さDisposeれる前に存在しないことを確認するので、はい、安全です。

あなたの場合、あなたは次のようなものを得るでしょう:

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

14

あなたはそれで大丈夫です:

using ((IDisposable)null) { }

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

サイドノート:でこれを間違えていないforeachIEnumerable、例外がスローされます。


1

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


-3

私の経験では、null参照例外は発生しません。単に無視されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.