3

Why Do I have to implement Dispose from IDisposable, What if I just implement any method in my class that releases the unmanaged resource?

People I talk to pretend to know the reason just telling me I have to do so.

Honestly, I think this is the kind of question too-obvious-to-ask-although-Idon't-know between some developers

4

3 回答 3

13

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

因为它建立了释放原生资源的通用接口(方法)。当您正确实施时,IDisposable我现在可以:

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

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

于 2013-03-25T00:04:51.860 回答
2

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

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

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

于 2013-03-25T19:50:42.967 回答
0

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

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

实现 IDisposable 接口是一个好习惯

于 2013-03-25T00:32:02.967 回答