首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我们可以使用Dispose方法而不实现IDisposable接口吗?

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

Stack Overflow用户
提问于 2015-02-12 14:49:19
回答 3查看 2.5K关注 0票数 3

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

EN

回答 3

Stack Overflow用户

发布于 2015-02-12 14:55:39

您可以将方法命名为Dispose,并将其作为普通方法使用,没有任何限制:

代码语言:javascript
运行
复制
public class MyClass {
  public void Dispose() {
    ...
  }
}
...

// using() emulation
MyClass m = null;

try {
  m = new MyClass();
  ...
}
finally {
  if (m != null)
    m.Dispose();
}

但是,如果需要using()语法,则必须实现IDisposable

代码语言:javascript
运行
复制
  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,要么为该方法找到其他名称。

票数 2
EN

Stack Overflow用户

发布于 2015-02-12 14:51:09

即使你没有实现IDisposable,托管对象也会被自动释放,IDisposable允许你释放那些不会像文件那样被释放的运行时,打开来处理非托管代码组件。

Implementing a Dispose Method

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

如果您不想使用IDisposable模式,而想拥有自己的模式,那么我认为不推荐使用这种方式,因为使用IDisposable时,您将不得不发现这一点是显而易见的。

票数 0
EN

Stack Overflow用户

发布于 2015-02-12 14:56:54

没有人会阻止你这样做,但这是一个非常糟糕的设计,因为每个人都知道idisposable接口。如果你给这个方法赋予了不同的含义,你就是在混淆你的设计,让任何人以后看你的代码时都会感到困惑。也许几年后你甚至不记得你做这件事的原因了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28471075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档