【问题标题】:c# implementing IDisposable Dispose correctlyc#正确实现IDisposable Dispose
【发布时间】:2020-04-29 12:20:15
【问题描述】:

我正在关注一个帖子示例,其中我有一个像 MyService 这样的服务并被包装在 using 关键字 like 中

(using MyService = new MyService())
{

}

编译后,编译器抱怨服务需要实现 IDisposable 所以我添加了

public class MyService : IDisposable
{
  void IDisposable.Dispose()
  {

  }
}

编译器没有抱怨,“使用”实现似乎正在工作,但我被告知这是错误的实现。我从这里的一篇文章中得到了 IDisposable.Dispose() 。现在大多数帖子都有添加公共无效处置(处置)的实现。

我正在寻找一种更简单的 Dispose 方法,而不是一些服务中的多种方法。 有没有更简单的方法?

谢谢

【问题讨论】:

  • After building, the compiler complained about the service needing to implement IDisposable so I added,如果您不需要实现IDisposable,那么不要将您的服务实例化包装在using 语句中。 using 块的唯一 目的是语法糖,以确保最后调用 Dispose()(即使抛出异常)。
  • Visual Studio 2019 很乐意为您自动实现它,如果您只需打开代码提示(Ctrl+.,或单击灯泡,当插入符号位于 Dispose() 方法的行上时) .
  • “但有人告诉我这是错误的实现” - 问他们为什么。我没有看到implicit interface implementation 有问题,也没有看到其他代码来判断。
  • @Sinatr OP 正在使用显式接口实现。虽然using 子句无关紧要,但在对象本身上使用Dispose 会更方便。并且,当使用这个short form of the Dispose pattern 时,该类应该被标记为sealed,它不是。

标签: c# .net


【解决方案1】:

如果您对这些类使用继承,则可以使这些类密封。这将阻止编译器抱怨你应该提供一个虚拟的 dispose 方法。

public sealed class MyService : IDisposable
{
    public void Dispose()
    {

    }
}

如果你希望这个类被继承,你应该提供一个public virtual void Dispose()方法,这样被继承的类就可以有一个Dispose方法。然后你必须实现 dispose(bool disposing) 模式。

【讨论】:

    【解决方案2】:

    如果你在你的类中实现了 IDisposable 接口,你真的需要了解它的用途。我相信你目前缺乏这方面的知识。我建议查看此链接并仔细阅读。

    这个接口的主要用途是释放非托管资源。当不再使用该对象时,垃圾收集器会自动释放分配给托管对象的内存。但是,无法预测垃圾收集何时发生。此外,垃圾收集器不了解非托管资源,例如窗口句柄或打开的文件和流。

    使用此接口的 Dispose 方法与垃圾收集器一起显式释放非托管资源。当不再需要对象时,对象的使用者可以调用此方法。

    IDisposable Interface

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 2011-07-17
      • 2012-04-19
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      相关资源
      最近更新 更多