2011-02-14 73 views
7
using (var sw = new StreamWriter (file)) 
{ 
    XmlSerializer xs = new XmlSerializer (typeof (T)); 
    xs.Serialize (sw, data); 
    sw.Close() 
} 

我知道你不必撥打Dispose,但是你必須撥打Close方法sw使用使用範圍時,您是否需要調用Close方法?

+2

http://stackoverflow.com/questions/1187700/does-disposing-a-streamwriter-close-the-underlying-stream – ClosureCowboy 2011-02-14 23:28:07

+0

可能的重複[是否Stream.Dispose始終調用Stream.Close(和Stream.Flush) ](http://stackoverflow.com/questions/911408/does-stream-dispose-always-call-stream-close-and-stream-flush) – 2011-02-14 23:53:09

回答

7

不!你不需要。這是由「使用」

2

IDisposable背後的整個想法是,如果調用IDisposable.Dispose方法,實現的類將執行「合理」清理所需的任何操作。由Dispose執行的確切操作可能因對象的狀態而異,並不一定是所需的清理方式。例如,一個命令/事務對象可以在沒有首先調用「提交」方法的情況下進行回滾。這會將命令/事務恢復到「安全」狀態,但不一定是預期的狀態。

還要注意,錯誤處理在涉及顯式「close」,確定性「dispose」或非確定性「finalize」(由於被放棄的對象而產生)的情況下可能會有所不同。從語義上明確地說,不導致關閉對象處於正確狀態的「關閉」操作應該拋出異常。 Dispose方法應該這樣做是不太清楚的。(*)某些類將拋出一個失敗的配置,而其他類不會。如果一個對象被拋棄並且在敲定過程中出現問題,很少有類會提供任何通知,因爲沒有好的處理機制。如果在保存文檔結束時「關閉」操作因爲某人太快拔出USB驅動器而失敗,應用程序可以通知用戶文檔可能未保存,並且用戶可以採取相應措施。如果應用程序放棄文件對象,以致在稍後的某個時間纔會發生「關閉」操作,此時USB驅動器已被刪除,但應用程序無法處理該錯誤。在前一種情況下,程序可能會建議用戶再次嘗試保存文檔,但在後一種情況下,文檔可能會消失。

(*)如果在發生Dispose時沒有異常掛起,並且Dispose無法執行其所需的清理,則很明顯應拋出異常。另一方面,如果一個異常已經掛起,那麼從Dispose中拋出將會破壞先前異常的所有信息。我的首選樣式是使用Dispose(Exception Ex)方法,如果Dispose失敗,它會將Ex作爲內部異常傳遞,但如果沒有語言支持,只能使用vb.net中的尷尬語法來支持這種事情,並且可疑行爲在C#中。

相關問題