如果我有以下代码:
FileStream fs = new FileStream(...);
TextWriter tw = new StreamWriter(fs);
我应该只调用twin . close()还是fs.Close() ?我在整个应用程序中持续使用textwwriter,所以我不能只是将它包装在using(…)块中,因为我需要能够在多个点上使用它。
否则,我就写成:
using (FileStream fs = new FileStream(...))
{
using (TextWriter tw = new StreamWriter(fs))
{
// do stuff
}
}
一起避免这个问题。但是,我真的不知道在这种情况下该怎么办。我关闭tw, fs,还是两者都关闭?
也,更一般地:如果我将多个流组合在一起,例如C(B(A)),我可以在C上调用Close/Dispose,然后不担心必须在B和A上调用它吗?
您只需要关闭StreamWriter
。
摘自StreamWriter.Close
方法的文档:
关闭当前StreamWriter对象和底层流。
在方法的文档中也值得注意:
Close的实现调用处理传递真值的方法。
这意味着关闭和释放StreamWriter
是等效的。您不必在关闭对象之后再处理它,或者在处理它之前关闭它。FileStream.Close
方法做同样的事情,因此关闭或处置StreamWriter
也将处置流。
如果你不能为一个类找到这样的信息,为了安全起见,你总是可以同时释放写器和流。处理一个已经被处理过的对象不会引起任何问题,而且该方法什么也不做。只要确保以正确的顺序关闭它们,即在流之前关闭写入器。
因为您已经将流声明包含在"using"语句中,所以您要而不是需要特别执行或。Using调用dispose, dispose调用close。
从SO查看本文
Dispose()
和tw
和fs
都是安全的。如果tw
确实发生在底层流Dispose()
上,再次调用Dispose()
将是无操作。
Update:现在我看到真正的问题了…在您的情况下,我会转向ILSpy,它显示TextWriter.Dispose()
确实在底层流上调用Close()
。所以你可以直接调用tw.Dispose()