我们能在未实现IDisposable接口的情况下使用Dispose方法吗?

3
我们能否在不实现IDisposable接口的情况下使用Dispose方法?

你可以将一个方法命名为 Dispose 并且无需任何限制地使用它,但是如果你想要使用 using() 语法,你必须实现 IDisposable 接口。 - Dmitry Bychenko
你不想实现 IDisposable 有什么特别的原因吗?在提问之前,你是否尝试过编译它? - Gusdor
我的问题是,我们是否可以在不实现IDisposable接口的情况下调用它的Dispose方法。例如对于连接对象,我们是否可以调用Con.Dispose? - Reshma Deshmukh
3个回答

2
您可以将一个方法命名为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,要么为该方法找到其他名称


0

即使您没有实现IDisposable,托管对象也会自动释放,而IDisposable可以让您释放运行时不会释放的文件、打开句柄和非托管代码组件。

实现Dispose方法

释放对象的模式,称为dispose模式,对对象的生命周期施加顺序。dispose模式仅用于访问非托管资源(如文件和管道句柄、注册表句柄、等待句柄或指向非托管内存块的指针)的对象。这是因为垃圾回收器在回收未使用的托管对象方面非常高效,但无法回收非托管对象。

如果您不想使用IDisposable模式并且想拥有自己的模式,那么我认为这不是推荐的方式,因为一个人必须发现这一点,而使用IDisposable则很明显。


0
没有人会阻止你这样做,但这是非常糟糕的设计,因为每个人都知道 idisposable 接口。如果你给这个方法赋予不同的含义,你就会使看你代码的人对你的设计感到困惑。也许在几年后甚至连你自己都记不起来为什么要这样做了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接