StreamWriter.Close()表示它还关闭StreamWriter的基础流。 StreamWriter.Dispose怎么样? Dispose是否也会处理和/或关闭基础流是否.Disposing StreamWriter关闭底层流?
回答
StreamWriter.Close()只是在引擎盖下调用StreamWriter.Dispose(),所以它们完全一样。 StreamWriter.Dispose()会关闭底层的流。
Reflector是你的朋友对这样的问题:)
Close和Dispose是StreamWriter的同义词。
好吧,几乎是同义词。 – 2012-05-16 21:49:54
从StreamWriter.Close()
public override void Close()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
从TextWriter.Dispose()(其中StreamWriter的继承)
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
他们因此是相同的。
从由Cwalina和艾布拉姆斯框架设计指南在部分引述有关Dispose模式:
考虑提供方法
Close()
,除了Dispose()
,如果收盘价标准术语的区。
显然,Microsoft遵循自己的指导方针,并假设这对于.NET基类库几乎总是一个安全的选择。
有人会说了,只是不处分流,这是一个非常糟糕的主意,因为一旦StreamWriter的超出范围垃圾回收可以随时把它捡起来,并dipose它,从而关闭句柄流,但创建它覆盖的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);
}
}
如果你在反射看起来/ ILSpy你会发现,基本流的结束在处置(真)实际完成,当close被调用时它只是调用Dispose来调用Dispose(True),从代码中应该没有其他副作用,所以上面的类很好地工作。
虽然您可能想要添加所有构造函数,但为了简单起见,我在此仅添加了2个。
答案很简单,并在上面提供:是的,处理一个流会关闭任何基础流。这里有一个例子:
public static string PrettyPrintXML_bug(XDocument document)
{
string Result = "";
using (MemoryStream mStream = new MemoryStream())
{
using (XmlTextWriter writer = new XmlTextWriter(mStream, Encoding.Unicode))
{
writer.Formatting = Formatting.Indented; // <<--- this does the trick
// Write the XML into a formatting XmlTextWriter
document.WriteTo(writer);
// change the memory stream from write to read
writer.Flush();
mStream.Flush();
} // <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- this also "closes" mStream
mStream.Position = 0;//rewind <-- <-- <-- "cannot Read/Write/Seek"
// Read MemoryStream contents into a StreamReader.
using (StreamReader sReader = new StreamReader(mStream)) // <-- <-- Exception: Cannot access a closed stream
{
// Extract the text from the StreamReader.
Result = sReader.ReadToEnd();
}
}
return Result;
}
和这里的解决方案,在那里你必须处置推迟到不需要底层的MemoryStream了:
public static string PrettyPrintXML(XDocument document)
{
string Result = "";
using (MemoryStream mStream = new MemoryStream())
{
using (XmlTextWriter writer = new XmlTextWriter(mStream, Encoding.Unicode))
{
writer.Formatting = Formatting.Indented; // <<--- this does the trick
// Write the XML into a formatting XmlTextWriter
document.WriteTo(writer);
// change the memory stream from write to read
writer.Flush();
writer.Close();
mStream.Flush();
mStream.Position = 0;//rewind
// Read MemoryStream contents into a StreamReader.
using (StreamReader sReader = new StreamReader(mStream))
{
// Extract the text from the StreamReader.
Result = sReader.ReadToEnd();
}
}// <-- here the writer may be Disposed
}
return Result;
}
看着这些例子,我不明白为什么关闭底层流是一项功能。
我只是喜欢分享这个。
- 1. 是否可以不关闭StreamReader/StreamWriter以保持底层流的打开?
- 2. 当没有底层流时,是否需要关闭扫描仪?
- 3. 关闭BufferedOutputStream是否也会关闭底层OutputStream?
- 4. 如何判断Streamwriter是否已关闭?
- 5. C#关闭StreamWriter
- 6. 关闭套接字是否关闭流?
- 7. 只要关闭底层可读性,不关闭Java扫描器是否安全?
- 8. stream.spliterator()是否关闭流?
- 9. Android Wear关闭位图资产底层流
- 10. 有没有办法在不关闭底层流的情况下关闭Writer?
- 11. BaseStream底层流
- 12. 显式关闭DataSet的底层连接?
- 13. 关闭TcpClient及其底层NetworkStream
- 14. 关闭所有底层网络连接
- 15. 底层连接已关闭。 (HttpWebRequest的)
- 16. AzCopy错误底层连接已关闭
- 17. Restharp:底层连接已关闭
- 18. WebClient.UploadData“底层连接已关闭”
- 19. Twitterizer底层连接被关闭
- 20. 底层连接已关闭 - webAPI,WCF
- 21. WebException:底层连接已关闭
- 22. WebRequest:底层连接已关闭
- 23. 我们是否总是要关闭流?
- 24. StreamWriter未正确关闭?
- 25. StreamWriter打开和关闭
- 26. httpWebRequest(底层连接已关闭:连接意外关闭。)
- 27. 如何关闭StreamWriter对象
- 28. WCF-“底层连接已关闭:连接意外关闭”
- 29. 底层连接已关闭:连接意外关闭
- 30. WP7 WCF底层连接已关闭:连接意外关闭
从技术上讲,它称之为Dispose(布尔)在发动机罩下,尽管 – ShuggyCoUk 2009-07-27 12:27:01
是最小的挑逗。我应该说它“调用处置”,而没有真正指定哪个过载。好点。 – 2009-07-27 13:14:05