C# 处理文件流和二进制读取器
我有一个类管理对二进制文件的访问。我希望在第一次请求时打开此文件,然后将其保持打开状态,直到我的类的实例被释放。我是这样实施的:C# 处理文件流和二进制读取器,c#,.net,C#,.net,我有一个类管理对二进制文件的访问。我希望在第一次请求时打开此文件,然后将其保持打开状态,直到我的类的实例被释放。我是这样实施的: public class SomeService : IDisposable { private BinaryReader _reader; public int ServiceFunction(...) { if (_reader == null) CreateReader(); /
public class SomeService : IDisposable
{
private BinaryReader _reader;
public int ServiceFunction(...)
{
if (_reader == null)
CreateReader();
// Do something with _reader and return a result
}
private void CreateReader()
{
var stream = new FileStream("myFile", FileMode.Open, FileAccess.Read);
_reader = new BinaryReader(stream);
}
public void Dispose()
{
if (_reader != null)
_reader.Dispose();
}
}
然后我会这样使用该类:
using (var service = new SomeService())
{
foreach (var item in someList)
{
// other stuff
if (eventuallyTrue)
{
int result = service.ServiceFunction(item.SomeProperty);
// other stuff
}
}
}
问题:
- 调用
就足够了,还是还需要明确地处理文件流\u reader.Dispose()
- 如果我也需要处理文件流,我可以修改
方法如下:dispose
public void Dispose() { if (_reader != null) { if (_reader.BaseStream != null) _reader.BaseStream.Dispose(); _reader.Dispose(); // Does the order of disposing matter here ? } }
- 或者我是否需要将
保存在单独的类变量FileStream
中,稍后再处理此流private FileStream\u stream
因此,作为2个相关或不相关一次性用品的一般模式,它将不起作用。因此,为了安全和一致,我会将流存储为_流,并在最后处理它。当然不会痛的 处理读卡器就足够了 但这是因为读者有一个特殊的“特性”,它承担了流的所有权
因此,作为2个相关或不相关一次性用品的一般模式,它将不起作用。因此,为了安全和一致,我会将流存储为_流,并在最后处理它。当然不会痛的 BinaryReader.Dispose和StreamReader.Dispose的当前实现始终强制释放/关闭底层流。没有解决办法 但是: Microsoft团队计划在下一版本的.NET中修复此问题
BinaryReader.Dispose和StreamReader.Dispose的当前实现总是强制底层流被释放/关闭。没有解决办法 但是: Microsoft团队计划在下一版本的.NET中修复此问题
谢谢您的链接。我决定听从亨克·霍特曼的建议,明确地处理阅读器和流。该链接确认,为了将来的兼容性,这样做似乎是很好的,尽管目前它是多余的。谢谢这个链接。我决定听从亨克·霍特曼的建议,明确地处理阅读器和流。该链接证实,为了将来的兼容性,这样做似乎很好,尽管目前它是多余的。