是不是可以不关闭StreamReader / StreamWriter来保持底层流打开?

我有一个基本上包装Stream用于读/写的类,但该流预计由该类的使用者管理。 为了便于使用,我使用StreamReader和StreamWriter类在流上执行I / O操作。 通常我会将读取器和写入器包装在using块中,但我想避免关闭读取器和写入器,因为这样做也会关闭底层流,我必须保持打开状态。

如果我希望调用者管理基础流,那么在内存/资源管理方面是否安全不关闭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 } } 

如果没有人关闭流,那么最终将调用终结器,它应该调用dispose并在GC上关闭它们。 但这在资源方面相当糟糕,因为它会留下任何可能昂贵的资源,直到GC。 你的物体存在的时间越长,情况就会越糟,特别是如果它能够保存到第1代甚至2代的藏品中。

如果你可以向你的呼叫者提供一些可以隔离它的东西,那肯定会很好。 也许你可以从流中缓存一些东西,这样你就可以关闭它,同时仍然向你的调用者提供内容?

编辑后编辑:现在我看到你的来电者通过你的流来操作,我的答案必须与众不同! 很明显,您的调用者应该管理流的生命周期。 我最初的印象是,你的class级创建了一个流,并希望调用者管理它。

解决此问题的最简单方法是将流包装在您自己的类中,该类派生自System.IO.Stream

示例: http : //csharptest.net/browse/src/Library/IO/NonClosingStream.cs

这是不正确的。 从msdn读到这个

close调用Dispose方法传递一个true值。 除非您明确调用Close,否则刷新流不会刷新其底层编码器。

尝试将所有IO封装在一个类中。