假设您有一个具有如下接口的类:
public interface Foo
{
Load(IDisposable something);
}
实现此方法时,我应该在完成后调用 dispose 吗?换句话说,当一个类的方法采用 a或任何其他是时Stream
,该方法是否也应该处理流,还是应该留给调用该方法的人?Reader
IDisposable
我知道任何一种方式都会奏效,只是好奇其他更有经验的人会认为良好的行为:-)
假设您有一个具有如下接口的类:
public interface Foo
{
Load(IDisposable something);
}
实现此方法时,我应该在完成后调用 dispose 吗?换句话说,当一个类的方法采用 a或任何其他是时Stream
,该方法是否也应该处理流,还是应该留给调用该方法的人?Reader
IDisposable
我知道任何一种方式都会奏效,只是好奇其他更有经验的人会认为良好的行为:-)
你不应该调用方法,因为你可能对对象做更多的Dispose
事情。如果您不需要更多,应该使用外部处理。示例代码:Load
IDisposable
using
using (var something = new Something())
{
IFoo foo = new Foo();
foo.Load(something);
// Do more with something
}
这取决于您的界面的记录行为。
如果流保持打开以供调用者“(重新)使用”是有意义的,那么您可以将其保持在某些记录状态(例如,在某某块之后的当前位置)。
否则,最有帮助的事情似乎是为用户处理它。
请注意,CLR 框架类有时具有专门的重载,以允许调用者指定应该发生的情况。参见例如:http: //msdn.microsoft.com/en-us/library/gg712952.aspx
public StreamReader(
Stream stream,
Encoding encoding,
bool detectEncodingFromByteOrderMarks,
int bufferSize,
bool leaveOpen
)
我会添加一个参数,所以调用者可以告诉我是否处理它(我还添加void
了方法返回类型):
public interface Foo
{
void Load(IDisposable something, bool disposeSomething);
}
如果您的对象包含其他本身是一次性的对象,那么您的对象也应该是一次性的。例如,持有对以独占读/写权限打开的文件的引用的对象应该是一次性的,以便对象的客户端可以控制底层资源何时关闭或清理。使 Foo 接口继承自 IDisposable