我们可以使用Dispose方法而不实现IDisposable接口吗?
发布于 2015-02-12 14:55:39
您可以将方法命名为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,要么为该方法找到其他名称。
发布于 2015-02-12 14:51:09
即使你没有实现IDisposable,托管对象也会被自动释放,IDisposable允许你释放那些不会像文件那样被释放的运行时,打开来处理非托管代码组件。
用于释放对象的模式,称为dispose模式,对对象的生命周期施加顺序。dispose模式仅用于访问非托管资源的对象,如文件和管道句柄、注册表句柄、等待句柄或指向非托管内存块的指针。这是因为垃圾回收器在回收未使用的托管对象方面非常有效,但它无法回收非托管对象。
如果您不想使用IDisposable模式,而想拥有自己的模式,那么我认为不推荐使用这种方式,因为使用IDisposable时,您将不得不发现这一点是显而易见的。
发布于 2015-02-12 14:56:54
没有人会阻止你这样做,但这是一个非常糟糕的设计,因为每个人都知道idisposable接口。如果你给这个方法赋予了不同的含义,你就是在混淆你的设计,让任何人以后看你的代码时都会感到困惑。也许几年后你甚至不记得你做这件事的原因了。
https://stackoverflow.com/questions/28471075
复制相似问题