【发布时间】:2015-09-24 10:29:51
【问题描述】:
我写了一段代码。我想确保我以正确的方式处理对象。
我有一个像这样的一次性类 用于从非托管资源中读取一些数据。
class MyFileReader : IDisposable
{
private readonly FileStream _stream;
public MyFileReader(FileStream stream)
{
_stream = stream;
}
public void Dispose()
{
_stream.Dispose();
}
}
目前在我的程序中,我像这样处理对象。
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (MyFileReader reader = new MyFileReader(stream))
{
//...
}
}
这对我来说似乎没问题。后来我注意到 Classes 是通过引用传递的,所以如果我处置其中一个,则可能不需要处置另一个。
我的问题是我可以做这样的事情吗?
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
MyFileReader reader = new MyFileReader(stream);
// Remove IDisposable from MyFileReader and stream will close after using.
}
还是这个?
FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
// stream will close after using.
using (MyFileReader reader = new MyFileReader(stream))
{
//...
}
【问题讨论】:
-
如果你通过构造函数传入一个流,那么不要处理它,因为它可能会在你的类之外使用。如果你的类创建了流,那么它负责处理它。
-
@Enigmativity 看看 Alexei Levenkovs 的回答。该框架当前正在处理它获得的流。也许看看
BinaryReader处理构造函数中的流。
标签: c# using idisposable