2010-03-26 27 views
128

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

回答

121

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

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

+18

請注意,即使你的變量爲null,using塊也是如果你在using塊中引用你的變量而沒有先對它進行空值檢查,你將會得到NullReferenceException。爲了防止誤解,這個答案應該說明:「是的,'Dispose()'只在非空對象上被調用」。 – surfen 2011-11-28 09:05:34

8

你應該確定它:

using ((IDisposable)null) { } 

也不例外這裏拋出。

備註:請不要將此錯誤與foreachIEnumerable錯誤地拋出。

24

using的擴展在調用Dispose之前檢查對象是不是null,所以是的,它是安全的。

你的情況,你會得到這樣的:

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

你不會得到空引用異常按我的經驗。它將被簡單地忽略。

0

是的,之前報廢后的參考值將是空檢查。您可以通過在Reflector中查看您的代碼來檢查自己。