C# 为什么我必须从IDisposable实现Dispose,为什么不只是一个简单的方法来发布。。。?

C# 为什么我必须从IDisposable实现Dispose,为什么不只是一个简单的方法来发布。。。?,c#,.net,idisposable,C#,.net,Idisposable,为什么我必须从IDisposable实现Dispose,如果我只是在类中实现释放非托管资源的任何方法呢 与我交谈的人假装知道原因,只是告诉我必须这样做 老实说,我认为这是一个很明显的问题,虽然我不知道一些开发者之间的问题 与我交谈的人假装知道原因,只是告诉我也知道 因为它建立了释放本机资源的公共接口(方法)。当您正确实施IDisposable后,我现在可以: 如果需要,请通过IDisposable界面处理您的类型 使用语句,而不是到处写try/finally,将创建的类型包装在一个中 使用自动工

为什么我必须从IDisposable实现Dispose,如果我只是在类中实现释放非托管资源的任何方法呢

与我交谈的人假装知道原因,只是告诉我必须这样做

老实说,我认为这是一个很明显的问题,虽然我不知道一些开发者之间的问题

与我交谈的人假装知道原因,只是告诉我也知道

因为它建立了释放本机资源的公共接口(方法)。当您正确实施IDisposable后,我现在可以:

  • 如果需要,请通过
    IDisposable
    界面处理您的类型
  • 使用语句,而不是到处写
    try/finally
    ,将创建的类型包装在一个
    
    
  • 使用自动工具检测在您的类实例上调用
    Dispose()
    失败的实例(即实现
    IDisposable
    的类实例)
  • 如果我犯了没有直接调用
    Dispose()
    的错误,请依靠运行时调用终结器(只要您正确实现了类,它将调用
    Dispose()
    )。并不是说您应该这样做,因为这会使资源管理变得不确定,但这是一个很好的以防万一的特性

  • 您不必实现IDisposable,您只需要在您的类型管理本机解析(运行时无法管理的资源)时实现即可。

    如果您可以确保在任何情况下都会调用您的发布函数,无论发生什么情况、异常、应用程序崩溃等。那么我会说,您不必实现IDisposable接口

    但事实是,如果您正在编写一个类或组件,您无法预测客户将如何使用它。他们可能会忘记调用您的释放函数。这将导致您的资源无法释放


    实现IDisposable接口是一个很好的实践

    IDisposable接口的独特之处在于它的存在实际上比它的缺失更能说明类。如果一个类实现了
    IDisposable
    ,则该类表示它可能已经请求某个外部实体(可以是任何类型的实体,世界上任何地方)代表它做一些事情,直到进一步通知为止,这可能会损害其他潜在用户,因此,它可能有责任确保外部实体在不再需要其服务时得到通知。例如,封装输入流的对象可能要求底层操作系统以独占方式访问文件[可能在不同的计算机上];除非对象告诉操作系统它已经完成了对文件的处理,或者承载该对象的应用程序终止,否则世界上任何地方都没有其他人能够访问该文件。因此,当文件不再需要时,对象有责任通知操作系统。请注意,输入流的使用者不会真正关心该流是否已实际请求任何外部实体代表其执行任何操作。相反,一旦流的消费者知道不再需要它,消费者就会调用流上的
    Dispose
    ,然后它可以执行任何必要的操作(如果有的话),以确保所有仍然代表它行事的实体(如果有的话)都被通知他们可以停止这样做。

    请注意,
    IDisposable
    并不是说类实际上会要求任何外部实体代表它做任何事情,也不是说它实际上有任何清理责任,也不是说放弃实例而不调用
    Dispose
    会造成任何实际伤害。但是,如果一个类没有实现
    IDisposable
    ,这就强烈地表明该类的实例没有承担任何责任来确保外部资源得到清理。至少,它提供了一个强有力的指示,表明可以安全地放弃对象,而无需撤消任何必要的清理操作[某些类型,如
    WeakReference
    需要清理,但不实现
    IDisposable
    ,而是依赖于终结]


    因此,我认为类实现
    IDisposable
    而不是使用其他清理方法的一个很好的理由是避免给人一种错误的印象,即实际上并不需要清理。

    一个简单的方法,你的意思是像Dispose这样的方法?当然,为什么要从IDisposable实现Dispose?我不明白downvoteI认为Dispose是释放非托管资源的简单方法-它只有一个通用名称,所以框架知道它。+1@在管理一些非琐碎/非托管资源的对象上实现
    IDisposable
    是惯例,因此大多数阅读代码的人都知道会发生什么。Ed的答案列表在编写时(通过C#/framework中的支持)会给您带来好处,但我要说的是,让读者以常见的方式了解预期行为同样重要。请注意,这在其他框架中也很常见-ASP.Net MVC是.Net land中的一个示例。实现
    IDisposable
    并不能保证没有终结器就不会有终结器。虽然运行终结器和调用
    Dispose
    执行清理会带来一些成本,因此终结器通常不必是性能上的赢家,但框架中有几个类(例如
    Threading.Thread
    WeakReference
    )它没有实现IDisposable,但仍然有终结器。@supercat:我不明白你的意思。正确实现
    IDisposable
    的类将从