假設我有以下幾點:哪個更好,何時使用語句或在C#中的IDisposable上調用Dispose()?
using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }
爲什麼不只是做以下而失去大括號的一對夫婦?:
var ctx = DataContextFactory.Create(0);
ctx.Dispose();
謝謝你的建議!
假設我有以下幾點:哪個更好,何時使用語句或在C#中的IDisposable上調用Dispose()?
using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }
爲什麼不只是做以下而失去大括號的一對夫婦?:
var ctx = DataContextFactory.Create(0);
ctx.Dispose();
謝謝你的建議!
第一個比較好。即使拋出異常,它也可以確保它被丟棄,並且它可以正確處理Create(0)
返回null的情況(即,它不會嘗試在空實例上調用Dispose()
)。
using語句爲您提供了很好的語法和異常保護。你不能在不調用Dispose的情況下離開using語句(它將翻譯成一個帶有調用處理的finally塊)。在第二種情況下,如果Create和Dispose之間有異常,則不會直接調用dispose。除非您使用非託管資源,否則這不是問題,但如果您是,則會泄漏。
如果可以,請使用using
,原因是Marc引用。 OTOH這不是一個腦死的解決方案,因爲有時候對象的生命週期不能被定義爲一個詞法範圍,所以要合理地使用它。
唯一不想使用使用塊的地方是可丟棄對象的範圍在函數之外。在這種情況下,您的類應該實現IDisposable並在其Dispose()中處理該對象。
一個using
語句總是因爲更好的...
Dispose()
,即使代碼演變成不同的代碼路徑Dispose()
被調用,即使有一個例外。它還會在致電Dispose()
之前檢查null
,這可能很有用(假設您不只是致電new
)。一個非顯而易見的(對我來說,反正)與using
關鍵就在於,如何避免過多的嵌套,當你有多個一次性對象:
using (var input = new InputFile(inputName))
using (var output = new OutputFile(outputName))
{
input.copyTo(output);
}
的VS代碼格式化會留下兩個語句開始在同一列。
事實上,在某些情況下,你甚至不必重複使用的語句...
using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2))
然而,在同一行聲明多個變量的限制適用於這裏所以類型必須相同,並且不能使用隱式類型var。
謝謝!那只是我正在尋找的答案。 – mkelley33 2009-06-23 19:56:02
另一個沒有人提到的小點是使用「using」可以防止您在初始化之後但在處理之前意外地變更變量「ctx」的內容。您不希望意外丟棄與您創建的不同的對象。 – 2009-06-23 20:01:42