实现IDisposable接口的目的是什么?

实现IDisposable接口的目的是什么? 我见过一些实现它的类,我不明白为什么。

如果您的类创建了非托管资源,那么您可以实现IDisposable,以便在处理对象时正确清理这些资源。 您重写Dispose并在那里释放它们。

当您的类使用某些系统资源时,类的责任是确保资源也被释放。 通过.Net设计,你应该在类的Dispose方法中做到这一点。 IDisposable接口标记您的类在不再使用时需要释放资源,并且Dispose方法可用,以便您的类的用户可以调用它来释放消耗的资源。

如果您希望自动清理工作正常并希望使用using()语句,则IDisposable方法也很重要。

除了释放非托管资源之外,对象可以在它们超出范围时有用地执行某些操作。 一个有用的例子可能是一个计时器对象:这样的对象可以打印出自Dispose()方法构造以来经过的时间。 然后可以使用这些对象记录某些操作所用的大致时间:

 using(Timer tmr=new Timer("blah")) { // do whatever } 

当然,这可以手动完成,但我的感觉是,只要有可能,编译器就能自动生成正确的代码。

这一切都与垃圾收集机制有关。 Chris Sells描述了垃圾收集,终结器以及.NET Rocks第10集的Dispose模式(和IDisposable接口)的原因! (开始大约34分钟)。

许多对象操纵其他实体的方式会导致问题,如果不清理。 这些其他实体几乎可以是任何东西,它们几乎可以在任何地方。 例如,Socket对象可能会要求另一台机器打开TCP连接。 那台其他机器可能无法同时处理很多连接; 实际上,它可能是一个配备网络的设备,一次只能处理一个连接。 如果一个程序要打开一个套接字而只是忘记它,除非或直到套接字关闭,否则没有其他计算机能够连接到该设备(也许设备可能会在几分钟不活动后关闭套接字,但它直到那时才会毫无用处)。

如果一个对象实现了IDisposable,这意味着它具有执行必要的清理操作所需的知识和动力,并且在这些知识和推动力丢失之前需要执行这样的操作。 调用IDisposable.Dispose将确保执行所有此类清理操作,从而可以安全地放弃该对象。

Microsoft允许对象通过注册名为Finalize的方法来请求防止放弃。 如果对象这样做,则在系统检测到对象已被放弃时将调用Finalize方法。 对象或其所持有的直接或间接引用的任何对象都不会从内存中删除,直到Finalize方法有机会运行。 如果在没有首先被处置的情况下放弃对象,这提供了一些“后备”。 但是,有许多陷阱,其中的对象实现了Finalize,因为无法保证何时调用它。 在调用Finalize之前,不仅可能长时间放弃一个对象,而且如果一个人不小心,系统实际上可能会在一个对象上调用Finalize,而其中一部分仍在使用中。 危险的东西。 最好正确使用Dispose。