是否将在具有空对象的using语句中调用Dispose()?

在(可能)空对象上使用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

37404 次浏览

你应该可以接受:

using ((IDisposable)null) { }

此处未抛出异常。

旁注:不要将此误认为foreachIEnumerable,其中将抛出异常。

using的扩展在对其调用Dispose之前,检查对象是否null,因此,它是安全的。

在你的情况下,你会得到这样的东西:

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

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

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

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

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