当我进行流合成时,我应该关闭哪个流?

  • 本文关键字:我应该 c# stream io
  • 更新时间 :
  • 英文 :


如果我有以下代码:

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()twfs都是安全的。如果tw确实发生在底层流Dispose()上,再次调用Dispose()将是无操作。

Update:现在我看到真正的问题了…在您的情况下,我会转向ILSpy,它显示TextWriter.Dispose()确实在底层流上调用Close()。所以你可以直接调用tw.Dispose()

相关内容

  • 没有找到相关文章

最新更新