该IDisposable
接口的独特之处在于它的存在实际上说明了一个类而不是它的缺失。如果一个类实现IDisposable
了 ,则该类表明它可能已经要求某个外部实体(可能是任何类型的实体,在宇宙中的任何地方)代表它做某事,直到另行通知,这可能会损害其他潜在用户,并且它可能因此有责任确保在不再需要其服务时通知外部实体。例如,封装输入流的对象可能要求底层操作系统独占访问文件[可能在不同的计算机上];直到对象告诉操作系统它已处理完该文件,或者托管该对象的应用程序终止,宇宙中的任何其他地方都无法访问该文件。因此,该对象有责任在不再需要该文件时通知操作系统。请注意,输入流的使用者并不真正关心该流是否真的要求任何外部实体代表它做任何事情。相反,一旦流的消费者知道不再需要它,消费者就会调用Dispose
在流上,然后可以执行任何必要的操作(如果有),以确保仍然代表它执行操作的所有实体(再次,如果有)被通知他们可以停止这样做。
请注意,IDisposable
这并不是说一个类实际上会要求任何外部实体代表它做任何事情,也不是说它实际上有任何清理职责,也不是说不调用就放弃实例会造成任何实际伤害Dispose
。但是,如果一个类没有实现IDisposable
,那么这将提供一个非常强烈的指示,表明该类的实例没有承担任何责任来确保清理外部资源。至少,它提供了一个强有力的指示,表明可以安全地放弃对象,而无需撤消任何必要的清理操作[某些类型,如WeakReference
需要清理但不实现IDisposable
,而是依赖于最终确定]
因此,我认为实现类IDisposable
而不是使用其他一些清理方法的一个很好的理由是避免给人一种不需要清理的错误印象。