是.Disposing StreamWriter关闭底层流?

nos*_*nos 51 .net c#

StreamWriter.Close()表示它还会关闭StreamWriter的底层流.那么StreamWriter.Dispose呢?Dispose是否也处置和/或关闭底层流

Rob*_*ine 52

StreamWriter.Close()只是在引擎盖下调用StreamWriter.Dispose(),所以它们完全相同.StreamWriter.Dispose()确实关闭了底层流.

对于像这样的问题,Reflector是你的朋友:)

  • @cloggins - 这就是我说的:"StreamWriter.Dispose()确实关闭了底层流".我从未说过它处理底层流. (7认同)
  • 你是对的.我应该说"调用dispose"而不实际指定哪个重载.好点. (2认同)

Aar*_*oyd 15

有些人会说,只是不要处理流,这是一个非常糟糕的主意,因为一旦编写器超出范围,GarbageCollection可以随时拾取并放弃它,从而关闭Handle到流,但创建一个后代类覆盖StreamWriter的这种行为很容易,继承代码:

/// <summary>
/// Encapsulates a stream writer which does not close the underlying stream.
/// </summary>
public class NoCloseStreamWriter : StreamWriter
{
    /// <summary>
    /// Creates a new stream writer object.
    /// </summary>
    /// <param name="stream">The underlying stream to write to.</param>
    /// <param name="encoding">The encoding for the stream.</param>
    public NoCloseStreamWriter(Stream stream, Encoding encoding)
        : base(stream, encoding)
    {
    }

    /// <summary>
    /// Creates a new stream writer object using default encoding.
    /// </summary>
    /// <param name="stream">The underlying stream to write to.</param>
    /// <param name="encoding">The encoding for the stream.</param>
    public NoCloseStreamWriter(Stream stream)
        : base(stream)
    {
    }

    /// <summary>
    /// Disposes of the stream writer.
    /// </summary>
    /// <param name="disposing">True to dispose managed objects.</param>
    protected override void Dispose(bool disposeManaged)
    {
        // Dispose the stream writer but pass false to the dispose
        // method to stop it from closing the underlying stream
        base.Dispose(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你查看Reflector/ILSpy,你会发现基本流的关闭实际上是在Dispose中完成的(true),当调用close时它只调用Dispose调用Dispose(True),从代码中应该没有其他的副作用,所以上面的课程很好.

您可能想要添加所有构造函数,为了简单起见,我刚刚添加了2.

  • 您正在尝试修复不存在的问题.GC将*不*处置任何对象,它将*最终确定它们.并且`StreamWriter`的终结器*将*调用`Dispose(false)`,即*不*处理`BaseStream`.我说*会*,因为`StreamWriter`甚至没有终结器 - 因为它不需要一个(它在终结器中没有任何意义). (10认同)

Shu*_*oUk 14

来自StreamWriter.Close()

public override void Close()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}
Run Code Online (Sandbox Code Playgroud)

来自TextWriter.Dispose()(StreamWriter继承)

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}
Run Code Online (Sandbox Code Playgroud)

因此,它们是相同的.


Joe*_*orn 6

Close和Dispose是StreamWriter的同义词.