我有一个类,它本质上包装了一个用于读/写的流,但该流预计由该类的使用者管理。为了便于使用,我使用 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
}
}
如果没有人关闭流,那么最终将调用终结器,它应该调用 dispose 并在 GC 时关闭它们。但这在资源方面是相当糟糕的,因为它会将所有可能昂贵的资源分配到 GC 之前。对象的寿命越长,情况可能会变得更糟,特别是如果它在集合中幸存下来并升级到第 1 代甚至第 2 代。
如果您可以向呼叫者提供一些可以隔离此问题的内容,那就太好了。也许您可以缓存流中的某些内容,以便可以关闭它,同时仍然向调用者提供内容?
EDIT编辑后:现在我看到你的呼叫者通过了一个要操作的流,我的答案必须不同!很明显,您的调用者应该管理流的生命周期。我一开始的印象是您的班级创建了一个流并希望调用者管理它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)