我们可以使用Dispose方法而不实现IDisposable接口吗?

问题描述:

我们可以使用Dispose方法而不实现IDisposable接口吗?我们可以使用Dispose方法而不实现IDisposable接口吗?

+0

你可以将一个方法命名为Dispose并且没有任何限制地使用它,但是如果你想使用()'语法你必须实现'IDisposable' – 2015-02-12 06:51:24

+0

是否有什么特别的原因你不想实现' IDisposable'?在问这个问题之前,你是否尝试过编译它? – Gusdor 2015-02-12 08:28:31

+0

我的问题是我们可以调用IDisposable接口的Dispose方法而不实现接口。例如,对于Connection对象,我们称之为Con.Dispose? – 2015-03-26 08:34:02

即使您未执行IDisposable,管理对象也会自动处理,IDisposable允许您处理哪些运行时不会像处理文件一样处理,打开处理非托管代码组件。

Implementing a Dispose Method

用于处置的对象的模式,被称为一个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或找到其他一些名称为的方法。

没有人会阻止你做这件事,但它是非常糟糕的设计,因为每个人都知道这个无可争议的接口。如果你给这种方法有不同的含义,那么你将设计混淆为谁以后再看看你的代码。也许即使你自己在几年内不记得你为什么这样做的原因。