2011-02-14 44 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#中。

相关问题