我们能否在不实现IDisposable接口的情况下使用Dispose方法?
Dispose
,并像普通方法一样使用它,没有任何限制:public class MyClass {
public void Dispose() {
...
}
}
...
// using() emulation
MyClass m = null;
try {
m = new MyClass();
...
}
finally {
if (m != null)
m.Dispose();
}
但是如果你想使用using()
语法,你必须实现 IDisposable
接口:
public class MyNextClass: IDisposable {
protected virtual void Dispose(Boolean disposing) {
...
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
}
...
// compare this with the using() emulation in the code above
using (MyNextClass n = new MyNextClass()) {
...
}
无论如何,即使可以将方法命名为Dispose
,但这不是一个好的实践,会惊讶(最终激怒)阅读你文本的开发人员(包括你)。所以要么实现IDisposable
,要么为该方法找到其他名称。
即使您没有实现IDisposable
,托管对象也会自动释放,而IDisposable
可以让您释放运行时不会释放的文件、打开句柄和非托管代码组件。
释放对象的模式,称为dispose模式,对对象的生命周期施加顺序。dispose模式仅用于访问非托管资源(如文件和管道句柄、注册表句柄、等待句柄或指向非托管内存块的指针)的对象。这是因为垃圾回收器在回收未使用的托管对象方面非常高效,但无法回收非托管对象。
如果您不想使用IDisposable模式并且想拥有自己的模式,那么我认为这不是推荐的方式,因为一个人必须发现这一点,而使用IDisposable则很明显。
Dispose
并且无需任何限制地使用它,但是如果你想要使用using()
语法,你必须实现IDisposable
接口。 - Dmitry BychenkoIDisposable
有什么特别的原因吗?在提问之前,你是否尝试过编译它? - Gusdor