我们可以使用Dispose方法而不实现IDisposable接口吗?
答
即使您未执行IDisposable
,管理对象也会自动处理,IDisposable允许您处理哪些运行时不会像处理文件一样处理,打开处理非托管代码组件。
用于处置的对象的模式,被称为一个dispose图案, 上的对象的生存期施加顺序。处理模式为 ,仅用于访问非托管资源的对象,如文件 和管道句柄,注册表句柄,等待句柄或指向 非托管内存块的指针。这是因为垃圾收集器 在回收未使用的管理对象时非常高效,但无法回收非管理对象。
如果你不想使用IDisposable模式,并希望有自己的话,我相信,因为它一会要找出可能明显使用了IDisposable是不推荐的方法。
答
可以命名一个方法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
这不是一个好的p ractice surprize(并最终刺激)开发人员(包括你)谁读你的文本;因此要么实施IDisposable
或找到其他一些名称为的方法。
答
没有人会阻止你做这件事,但它是非常糟糕的设计,因为每个人都知道这个无可争议的接口。如果你给这种方法有不同的含义,那么你将设计混淆为谁以后再看看你的代码。也许即使你自己在几年内不记得你为什么这样做的原因。
你可以将一个方法命名为Dispose并且没有任何限制地使用它,但是如果你想使用()'语法你必须实现'IDisposable' – 2015-02-12 06:51:24
是否有什么特别的原因你不想实现' IDisposable'?在问这个问题之前,你是否尝试过编译它? – Gusdor 2015-02-12 08:28:31
我的问题是我们可以调用IDisposable接口的Dispose方法而不实现接口。例如,对于Connection对象,我们称之为Con.Dispose? – 2015-03-26 08:34:02