gpt4 book ai didi

c# - 可以不关闭 StreamReader/StreamWriter 以保持底层流打开吗?

转载 作者:可可西里 更新时间:2023-11-01 03:02:13 25 4
gpt4 key购买 nike

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

如果我希望底层 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
}
}

最佳答案

如果没有人关闭流,那么最终将调用终结器,它应该调用处置并在 GC 上关闭它们。但这在资源方面相当糟糕,因为它会将分配的任何可能昂贵的资源留给 GC。对象存活的时间越长,情况可能会变得更糟,尤其是当它在集合中存活下来并升级到第 1 代甚至第 2 代时。

如果您能向来电者展示一些隔离此问题的内容,那肯定会很好。也许您可以缓存流中的某些内容,以便在关闭它的同时仍向调用者提供内容?

编辑 在您编辑之后:现在我看到您的来电者通过了要操作的流,我的回答必须不同!很明显,您的调用者应该管理流的生命周期。一开始我的印象是您的类(class)创建了一个流并希望调用者管理它。

关于c# - 可以不关闭 StreamReader/StreamWriter 以保持底层流打开吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4465824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com