如果我有以下代码:
FileStream fs = new FileStream(...);
TextWriter tw = new StreamWriter(fs);
我是否应该只调用tw.Close()或fs.Close()?我在整个应用程序中持久使用TextWriter,所以我不能将它包装在Using(...)块中,因为我需要能够在多个点使用它。
否则,我会把它写成:
using (FileStream fs = new FileStream(...))
{
using (TextWriter tw = new StreamWriter(fs))
{
// do stuff
}
}
完全避免这个问题。但是,我真的不知道在这种情况下该怎么做。 我是否关闭tw,fs或两者?
另外,更一般地说:如果我将多个流组合在一起,例如C(B(A)),我可以在C上调用Close / Dispose,然后不用担心必须在B和A上调用它吗?
答案 0 :(得分:4)
您只需要关闭StreamWriter
。
来自StreamWriter.Close
方法的文档:
关闭当前的StreamWriter对象 和潜在的流。
该方法的文档也值得注意:
Close的这个实现调用了 Dispose方法传递一个真值。
这意味着关闭和处置StreamWriter
是等效的。关闭后不必处置对象,或者在处理对象之前将其关闭。 FileStream.Close
方法也是如此,因此关闭或处置StreamWriter
也会处理流。
如果您无法在课程中找到这样的信息,您可以始终将编写器和流都设置为安全。处置已经处置的对象不会导致任何问题,并且该方法将不执行任何操作。只需确保以正确的顺序关闭它们,即在流之前关闭编写器。
答案 1 :(得分:1)
由于您已在“使用”声明中附上了您的流声明,因此不需要专门执行 。使用invokes dispose和dispose调用close。
答案 2 :(得分:0)
Dispose()
和tw
fs
你是安全的。如果tw
确实发生了Dispose()
基础流,则再次调用Dispose()
将是无操作。
更新:现在我看到了真正的问题......在您的情况下,我会转向ILSpy,它显示TextWriter.Dispose()
确实在基础流上调用了Close()
。所以你可以打电话给tw.Dispose()
。