IDisposable接口

Tal*_*ner 12 c#

我知道IDisposableInterface和它在.net中的使用但是我脑子里有一个问题,如果我正在编写所有托管代码,那么实现IDisposable接口是否有意义?

我知道何时以及如何使用Idisposible但我的问题是,如果我正在编写所有托管代码说一个简单的类没有什么昂贵的,所以如果我IDisposable在这个类中实现并做一些清理,如释放一些全局值,它是否有意义?

Nay*_*yan 11

不,您可能不需要使用IDisposble接口.但是,它建议在某些情况下(我可能会添加更多,因为我记得:) :):

  1. 你的类有很多对象,并且有很多交叉引用.即使它全部被管理,GC也可能因为活动引用而无法回收内存.你有机会(除了编写终结器)来解开引用并按照你附加它们的方式分解链接.因此,您正在帮助GC回收内存.

  2. 你有一些流是开放的,直到类的对象死亡.即使管理这些文件/网络等实现,它们也会深入到Win32模式下的句柄.因此,您有机会编写一个Dispose可以关闭流的方法.GDI对象也是如此,还有更多.

  3. 您正在编写一个使用非托管资源的类,并且您希望将程序集发送给第三方.您最好使用一次性图案,以确保您能够释放手柄以避免泄漏.

  4. 感谢supercat:您的类实现了许多事件处理程序并将它们连接到事件.暴露事件的类的对象(如Form等)将不会被GC释放,因为类(可能)的本地实现仍然会挂钩到这些事件中.你可以解开那些事件处理程序Dispose; 再次帮助GC.

嗯......我现在记不起来了,但是如果这个类的行为很复杂,你可能想重新考虑为什么你不想要实现IDisposable接口.


Ste*_*tti 7

经验法则:如果您的类型具有自身IDisposable或不受管理的成员变量,则需要实现IDisposable.GC在.NET中是不确定的,IDisposable为您提供了一种确定性的方法,即不回收内存而是回收资源.因此,当调用Dispose()时,GC不会立即释放您的内存,但您可以确定性地清理非托管资源(例如,确保您的数据库连接已关闭,并且您没有在服务器上进行最大连接).