2009-06-23 55 views

回答

26

第一個比較好。即使拋出異常,它也可以確保它被丟棄,並且它可以正確處理Create(0)返回null的情況(即,它不會嘗試在空實例上調用Dispose())。

+0

謝謝!那只是我正在尋找的答案。 – mkelley33 2009-06-23 19:56:02

+11

另一個沒有人提到的小點是使用「using」可以防止您在初始化之後但在處理之前意外地變更變量「ctx」的內容。您不希望意外丟棄與您創建的不同的對象。 – 2009-06-23 20:01:42

2

using語句爲您提供了很好的語法和異常保護。你不能在不調用Dispose的情況下離開using語句(它將翻譯成一個帶有調用處理的finally塊)。在第二種情況下,如果Create和Dispose之間有異常,則不會直接調用dispose。除非您使用非託管資源,否則這不是問題,但如果您是,則會泄漏。

3

如果可以,請使用using,原因是Marc引用。 OTOH這不是一個腦死的解決方案,因爲有時候對象的生命週期不能被定義爲一個詞法範圍,所以要合理地使用它。

3

唯一不想使用使用塊的地方是可丟棄對象的範圍在函數之外。在這種情況下,您的類應該實現IDisposable並在其Dispose()中處理該對象。

7

一個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

相關問題