191

using在(可能)空对象上使用该语句是否安全?
考虑以下示例:

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

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

是否保证Dispose只有当对象不为空时才会调用它,而且我不会得到一个NullReferenceException

4

5 回答 5

187

是的,Dispose()仅在非空对象上调用:

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

于 2010-03-26T11:26:56.037 回答
43

的扩展using检查对象不是null在调用Dispose它之前,所以是的,它是安全的。

在你的情况下,你会得到类似的东西:

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

是的,在 Disposing 之前,将对引用进行空检查。您可以通过在 Reflector 中查看您的代码来检查自己。

于 2010-03-26T11:27:03.653 回答
-2

根据我的经验,您不会得到空引用异常。它将被简单地忽略。

于 2010-03-26T11:26:33.200 回答