我们可以在不实现IDisposable接口的情况下使用Dispose方法吗?

时间:2015-02-12 06:49:19

标签: c# idisposable

我们可以在不实现IDisposable接口的情况下使用Dispose方法吗?

3 个答案:

答案 0 :(得分: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或者为方法找到其他名称

答案 1 :(得分:0)

即使您没有实现IDisposable,也会自动处理托管对象,IDisposable允许您处置哪个运行时不会像文件一样处置,打开处理非托管代码组件。

Implementing a Dispose Method

  

处理对象的模式,称为配置模式,   对物体的寿命施加顺序。处置模式是   仅用于访问非托管资源的对象,例如文件   和管道句柄,注册表句柄,等待句柄或指向   非托管内存块。这是因为垃圾收集器   回收未使用的托管对象非常有效,但它无法使用   收回非托管对象。

如果您不想使用IDisposable模式并希望拥有自己的模式,那么我认为这不是推荐的方式,因为它必须发现使用IDisposable可以显而易见。

答案 2 :(得分:0)

没有人会阻止你这样做,但设计非常糟糕,因为每个人都知道idisposable接口。如果您对此方法赋予不同的含义,那么您将设计混淆为以后查看代码的人。也许甚至在几年之后你就不记得你为什么这么做了。