我有一个基本上包装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
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有人关闭流,那么最终将调用终结器,它应该调用dispose并在GC上关闭它们.但这在资源方面相当不错,因为它会留下任何可能昂贵的资源,直到GC.你的物体存在的时间越长,情况就会越糟,特别是如果它能够保存到第1代甚至2代的藏品中.
如果你能向你的呼叫者提供一些可以隔离它的东西,那肯定会很好.也许你可以从流中缓存一些东西,这样你就可以在向你的调用者提供内容的同时关闭它?
编辑后编辑:现在我看到你的来电者通过你的流来操作,我的答案必须与众不同!很明显,您的调用者应该管理流的生命周期.我最初的印象是,你的班级创建了一个流,并希望调用者管理它.