2011-06-15 58 views
6

例如如果使用塊返回,是否會處理IDisposable?

using(var something = GetSomething()) 
{ 
    something.DoSomething(); 
    if(something.IsX()) return true; 
} 
return false; 
+0

嗯,這是一個有趣的,你做一個GetSomething()而不是一個新的東西。我不認爲這個框架有區分差異的智能。如果Something是一個單例,那麼退出後可能會得到「DisposedObject」異常。您可以構建一個小型測試應用程序,以瞭解框架在Using(GetSomething())中的作用。 – 2011-06-15 11:00:00

回答

8

是的,絕對。 Dispose方法被調用,但是using語句被執行,除非它是一個突然的全進程終止。最常見的情況是:

  • return
  • 例外被塊
  • 到達塊自然

的端部基本上是一個內拋出(和未被捕獲)的塊內using聲明主要是一個try/finally區塊的語法糖 - 而finally具有所有相同的屬性。

編輯:從C# 4 specification的第8.13節:

一個using語句stranslated分爲三個部分:獲取,使用和處置。資源的使用隱含在包含finally子句的try語句中。此finally子句配置資源。

finally語句在說明書的部分說明8.10:在控制離開try語句

一個finally塊的語句總是執行。無論控制轉移是否由於正常執行而發生,都是如此;作爲執行break,continuegotoreturn聲明的結果;或者由於傳播了try聲明中的例外。

+1

我知道你是Jon Skeet,但你能引用一個參考嗎? :) – 2011-06-15 10:31:14

+5

@Louis:不可能 - 所有文檔參考Jon Skeet。 – mdm 2011-06-15 10:33:49

+0

我添加了文檔和代碼示例的鏈接。 – 2011-06-15 10:36:20

0

據我所知,使用塊只要退出範圍就會處理該對象。

例如,當返回true時,下一個語句超出範圍,因此變量將被丟棄。

0

我只要控制會走出{}處置想到會被調用,所以在短期Yes

1

是的,用的就是一個編譯器功能,其擴展到

try { 
    ... 
    return ...; 
} 
finally { 
    foo.Dispose(); 
} 
2

是。

using is syntactic sugar for a try/finally block

using語句確保 處置是即使當你調用對象的方法 發生異常 調用。通過將對象 置於try塊內,然後調用 在finally塊中處理,可以實現 的相同結果;

In the documentation on the finally block

而捕獲用於處理髮生在一份聲明中 塊 例外,最終被用於保證無論在前的是如何嘗試 代碼 語句塊執行 塊已退出。

因此,using被轉換爲try/finally,隨着finally部分.Dispose(),確保其始終執行,無論在try/catch語句會發生什麼。

0

尚未提及的一點是,儘管「使用」塊中的「返回」將調用控制變量上的Dispose,但迭代器中「使用」塊內的「yield return」不會處理受控除非與迭代器關聯的IEnumerator被Disposed。

相關問題