2011-07-02 35 views
2

我正在使用一些XmlReaderXmlWriter對象來對某些try...catch塊內的字符串做一些必要的工作。顯式轉換爲IDisposable

我知道,使用符號using (XmlReader NewReader = XmlReader.Create(...))是首選語法,但我真的不喜歡那個,所以我也追加finally塊和執行NewReader.Close();NewWriter.Close();

但是,代碼分析抱怨說這些對象沒有被處置,因此迫使我以某種方式調用Dispose()方法。

問題是,在這些類中Dispose()方法是明確實施的,所以我必須使用((IDisposable)(NewReader)).Dispose();((IDisposable)(NewWriter)).Dispose();

這種技術有什麼缺點嗎?

+7

爲什麼你不想使用using語句。它做你需要做的一切,你不會得到fxcop警告*,*它比使用try-finally更簡潔。 – s1mm0t

回答

1

的C#using語句總是調用Dispose你。它roughtly轉換爲以下:

XmlReader NewReader = XmlReader.Create(...); 
try 
{ 
    // do stuff on NewReader 
} 
finally 
{ 
    ((IDisposable)NewReader).Dispose(); 
} 

所以finally包裹它youself不添加任何價值。雖然CloseDispose往往是相同的,但情況並非總是如此。由於這個FxCop是正確的,你應該總是呼叫Dispose,當你這樣做(或讓using聲明這樣做),沒有理由手動呼叫Close

1

using聲明確實是首選解決方案。它在C#中是慣用的。這些類顯式實現了IDisposable,因爲它們已經提供了一個關閉語義的方法:Close。我敢打賭,Dispose調用Close,反之亦然。 但是你不應該指望這一點,並且總是應該總是致電Dispose

在結束時,所有這些是等效的:

  1. 使用using,這是優選的;
  2. 撥打Closefinally塊,並抑制靜態分析警告或;
  3. finally呼叫Dispose((IDisposable)NewReader).Dispose();
+0

不幸的是,'Close'和'Dispose'並不總是表現相同。除了明顯的區別之外,關閉的實例通常可以重新打開,而處置的實例不能,當調用'Close'(例如'SqlConnection')時,某些對象不會抑制最終化,這會強制您調用Dispose來防止GC上的額外壓力。 – Steven

+0

好點Steven,我已經相應更新了。 –

4

有充分的理由不使用using

  • 當對象的生命週期可能需要比當前塊

存活期較長並有避免using不佳的原因:

  • 「我不是很喜歡那個」

這個好理由適用於您的代碼嗎?

另請注意,一個簡單的擴展方法會使語法再次變得很好並且乾淨。

相關問題