实现IDisposable接口的目的是什么?我见过一些实现它的类,我不明白为什么。
答案 0 :(得分:9)
如果您的类创建了非托管资源,那么您可以实现IDisposable,以便在处理对象时正确清理这些资源。您重写Dispose并在那里释放它们。
答案 1 :(得分:5)
当您的类使用某些系统资源时,类的责任是确保资源也被释放。通过.Net设计,你应该在类的Dispose方法中做到这一点。 IDisposable接口标记您的类在不再使用时需要释放资源,并且Dispose方法可用,以便您的类的用户可以调用它来释放消耗的资源。
如果您希望自动清理工作正常并希望使用using()语句,则IDisposable方法也很重要。
答案 2 :(得分:3)
除了释放非托管资源之外,对象可以在它们超出范围时有用地执行某些操作。一个有用的例子可能是一个计时器对象:这样的对象可以打印出自Dispose()方法构造以来经过的时间。然后可以使用这些对象记录某些操作所需的大致时间:
using(Timer tmr=new Timer("blah"))
{
// do whatever
}
当然,这可以手动完成,但我的感觉是,应尽可能利用编译器自动生成正确代码的能力。
答案 3 :(得分:2)
这一切都与垃圾收集机制有关。 Chris Sells描述了垃圾收集,终结器以及Dispose模式(以及IDisposable接口)episode 10 of .NET Rocks!的原因(开始大约34分钟)。
答案 4 :(得分:1)
许多对象操纵其他实体,如果不清理会导致问题。这些其他实体几乎可以是任何东西,它们几乎可以在任何地方。例如,Socket对象可能会要求另一台机器打开TCP连接。那台其他机器可能无法同时处理很多连接;实际上,它可能是一个配备网络的设备,一次只能处理一个连接。如果一个程序要打开一个套接字而只是忘记它,除非或直到套接字关闭,否则没有其他计算机可以连接到该设备(也许设备可能会在几分钟不活动后关闭套接字,但它直到那时才会毫无用处。)
如果一个对象实现了IDisposable,这意味着它具有执行必要的清理操作所需的知识和动力,并且需要在这些知识和动力丢失之前执行这些操作。调用IDisposable.Dispose将确保执行所有此类清理操作,从而可以安全地放弃该对象。
Microsoft允许对象通过注册名为Finalize的方法来请求防止放弃。如果对象这样做,则在系统检测到对象已被放弃时将调用Finalize方法。对象或它所持有的直接或间接引用的任何对象都不会从内存中删除,直到Finalize方法有机会运行。这提供了某种“逆止器”,以防物体在没有首先被处置的情况下被放弃。但是,有许多陷阱,其中的对象实现了Finalize,因为无法保证何时调用它。在调用Finalize之前,不仅可能长时间放弃一个对象,而且如果一个人不小心,系统实际上可能会在一个对象上调用Finalize,而其中一部分仍在使用中。危险的东西。最好正确使用Dispose。