191

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か?

4

5 に答える 5

187

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

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

于 2010-03-26T11:26:56.037 に答える
43

の拡張は、オブジェクトを呼び出す前にusingオブジェクトが存在しないことを確認するため、安全です。nullDispose

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

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}
于 2010-03-26T11:25:47.457 に答える
18

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

using ((IDisposable)null) { }

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

補足:これを例外がスローされる場所foreachと間違えないでください。IEnumerable

于 2010-03-26T11:25:36.123 に答える
1

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

于 2010-03-26T11:27:03.653 に答える
-2

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

于 2010-03-26T11:26:33.200 に答える