当我组合流时,我会关闭哪个流?

时间:2011-04-23 23:06:44

标签: c# stream io

如果我有以下代码:

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上调用它吗?

3 个答案:

答案 0 :(得分:4)

您只需要关闭StreamWriter

来自StreamWriter.Close方法的文档:

  

关闭当前的StreamWriter对象   和潜在的流。

该方法的文档也值得注意:

  

Close的这个实现调用了   Dispose方法传递一个真值。

这意味着关闭和处置StreamWriter是等效的。关闭后不必处置对象,或者在处理对象之前将其关闭。 FileStream.Close方法也是如此,因此关闭或处置StreamWriter也会处理流。

如果您无法在课程中找到这样的信息,您可以始终将编写器和流都设置为安全。处置已经处置的对象不会导致任何问题,并且该方法将不执行任何操作。只需确保以正确的顺序关闭它们,即在流之前关闭编写器。

答案 1 :(得分:1)

由于您已在“使用”声明中附上了您的流声明,因此需要专门执行 。使用invokes dispose和dispose调用close。

See this article from SO

答案 2 :(得分:0)

Dispose()tw fs你是安全的。如果tw确实发生了Dispose()基础流,则再次调用Dispose()将是无操作。

更新:现在我看到了真正的问题......在您的情况下,我会转向ILSpy,它显示TextWriter.Dispose()确实在基础流上调用了Close() 。所以你可以打电话给tw.Dispose()