StreamWriter.Close()表示它还会关闭StreamWriter的底层流.那么StreamWriter.Dispose呢?Dispose是否也处置和/或关闭底层流
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.
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)
因此,它们是相同的.