using(var something = GetSomething())
{
something.DoSomething();
if(something.IsX()) return true;
}
return false;
回答
是的,絕對。 Dispose
方法被調用,但是using
語句被執行,除非它是一個突然的全進程終止。最常見的情況是:
- 甲
return
- 例外被塊
- 到達塊自然
的端部基本上是一個內拋出(和未被捕獲)的塊內using
聲明主要是一個try
/finally
區塊的語法糖 - 而finally
具有所有相同的屬性。
編輯:從C# 4 specification的第8.13節:
一個
using
語句stranslated分爲三個部分:獲取,使用和處置。資源的使用隱含在包含finally
子句的try
語句中。此finally
子句配置資源。
的finally
語句在說明書的部分說明8.10:在控制離開try
語句
一個
finally
塊的語句總是執行。無論控制轉移是否由於正常執行而發生,都是如此;作爲執行break
,continue
,goto
或return
聲明的結果;或者由於傳播了try
聲明中的例外。
我知道你是Jon Skeet,但你能引用一個參考嗎? :) – 2011-06-15 10:31:14
@Louis:不可能 - 所有文檔參考Jon Skeet。 – mdm 2011-06-15 10:33:49
我添加了文檔和代碼示例的鏈接。 – 2011-06-15 10:36:20
據我所知,使用塊只要退出範圍就會處理該對象。
例如,當返回true時,下一個語句超出範圍,因此變量將被丟棄。
我只要控制會走出{}
處置想到會被調用,所以在短期Yes
是的,用的就是一個編譯器功能,其擴展到
try {
...
return ...;
}
finally {
foo.Dispose();
}
是。
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語句會發生什麼。
尚未提及的一點是,儘管「使用」塊中的「返回」將調用控制變量上的Dispose,但迭代器中「使用」塊內的「yield return」不會處理受控除非與迭代器關聯的IEnumerator被Disposed。
- 1. 方法返回一個IDisposable - 我是否應該處理結果,即使它沒有分配給任何東西?
- 2. 我是否必須處理我不使用的返回對象?
- 3. 多處理池返回結果可用
- 4. 如果我使用ELMAH,是否需要使用異常處理?
- 5. 同時處理多個請求並使用Klein模塊Python返回結果
- 6. NUnit是否處理實現IDisposable的對象?
- 7. 如果父級的實例返回true,那麼instanceof是否會返回true?
- 8. 如果GoogleApiClient返回連接,Android Wear是否會收到PutDataRequest?
- 9. 如果發生異常,ThreadPoolExecutor :: afterExecute是否會返回runnable?
- 10. 如果套接字仍然連接,EndReceive是否會返回零?
- 11. 如果元素存在,Set.remove是否會返回false?
- 12. 如果我在方法中的一個using塊中返回一個值,在返回之前是否使用了對象的處理方式?
- 13. 在HTTP處理程序中,如果知道內容不會更改,是否可以返回304?
- 14. 如何使mongocxx遊標返回批處理結果
- 15. 使用soapui處理webservice的返回結果
- 16. 如果我使用begin ... rescue,rails是否會回滾?
- 17. 如何使用IDisposable處置對象
- 18. 如果是元音,則返回true,否則返回false
- 19. 如何處理使用LINQ的IDisposable序列?
- 20. 如何使用Unity處理IDisposable存儲庫?
- 21. 返回值處理
- 22. PDL是否有信號處理模塊?
- 23. BMI如果使用返回
- 24. 如果腳本正在逐行處理,如何返回以處理前一行?
- 25. 多處理模塊是否修復CPython多核使用?
- 26. 如何使用塊來處理由NS方法返回的錯誤
- 27. MemoryStream是否在作爲ActionResult返回時自動處理?
- 28. 我是否應該處理從EditorSupport返回的jface CellEditors
- 29. Interlocked.Exchange的返回值是否也以原子方式處理?
- 30. Glimpse是否可以處理返回JsonResult的動作?
嗯,這是一個有趣的,你做一個GetSomething()而不是一個新的東西。我不認爲這個框架有區分差異的智能。如果Something是一個單例,那麼退出後可能會得到「DisposedObject」異常。您可以構建一個小型測試應用程序,以瞭解框架在Using(GetSomething())中的作用。 – 2011-06-15 11:00:00