我有一个基本上包装Stream用于读/写的类,但该流预计由该类的使用者管理。为了便于使用,我使用StreamReader和StreamWriter类在流上执行I / O操作。通常情况下,我会将读取器和写入器封装在using
块中,但我想避免关闭读取器和写入器,因为这样做也会关闭底层流,我必须保持打开状态。
如果我希望调用者可以管理基础Stream,那么在内存/资源管理方面是否安全不关闭StreamReader / StreamWriter?当流在其他地方明确关闭时,读写器是否会被垃圾收集?
public class Wrapper
{
private Stream _underlyingStream;
public Wrapper(Stream underlyingStream)
{
_underlyingStream = underlyingStream;
}
public string GetValue()
{
_underlyingStream.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(_underlyingStream);
return reader.ReadToEnd(); // we're done, but the stream is not ours to close
}
}
答案 0 :(得分:4)
如果没有人关闭流,那么最终将调用终结器,它应该调用dispose并在GC上关闭它们。但这在资源方面相当不错,因为它会留下任何可能昂贵的资源,直到GC。你的物体存在的时间越长,情况就会越糟,特别是如果它能够保存到第1代甚至2代的藏品中。
如果你能向你的来电者提供隔离的东西,那肯定会很好。也许你可以从流中缓存一些内容,这样你就可以在仍然向调用者提供内容的同时关闭它?
编辑后编辑:现在,我看到您的来电者通过了您的操作流,我的答案必须与众不同!很明显,您的调用者应该管理流的生命周期。我最初的印象是,你的班级创建了一个流,并希望调用者管理它。
答案 1 :(得分:1)
解决此问题的最简单方法是将流包装在您自己的类中,该类派生自System.IO.Stream
实施例: http://csharptest.net/browse/src/Library/IO/NonClosingStream.cs
答案 2 :(得分:0)
这是不正确的。 read this from msdn
close调用Dispose方法传递一个true值。 除非您明确调用Close,否则刷新流不会刷新其底层编码器。
尝试将所有IO封装在一个类中。