使用带有null对象的语句

时间:2010-03-26 11:22:44

标签: c# idisposable using

对(可能)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...
            }
        }
    }
}

是否保证仅当对象不为空时才会调用Dispose,并且我不会获得NullReferenceException

5 个答案:

答案 0 :(得分:152)

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

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

答案 1 :(得分:29)

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

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

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

答案 2 :(得分:12)

你应该没问题:

using ((IDisposable)null) { }

这里没有例外。

旁注:请不要将此错误与foreachIEnumerable一起引发异常。

答案 3 :(得分:1)

是的,在处置参考之前将进行空检查。您可以通过在Reflector中查看代码来检查自己。

答案 4 :(得分:-3)

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