对空对象使用语句

问题描述:

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

+3

我建议尝试一下......你已经得到了大部分你需要的代码 – cjk 2010-03-26 11:24:33

+0

相关http://stackoverflow.com/questions/2513035 – 2010-03-26 11:37:31

是,Dispose()只要求非空对象:

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

+18

请注意,即使你的变量为null,using块也是如果你在using块中引用你的变量而没有先对它进行空值检查,你将会得到NullReferenceException。为了防止误解,这个答案应该说明:“是的,'Dispose()'只在非空对象上被调用”。 – surfen 2011-11-28 09:05:34

你应该确定它:

using ((IDisposable)null) { } 

也不例外这里抛出。

备注:请不要将此错误与foreachIEnumerable错误地抛出。

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

你的情况,你会得到这样的:

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

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

是的,之前报废后的参考值将是空检查。您可以通过在Reflector中查看您的代码来检查自己。