首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDisposable接口

IDisposable接口
EN

Stack Overflow用户
提问于 2010-10-12 01:18:40
回答 5查看 1.2K关注 0票数 12

我知道IDisposable接口以及它在.net中的用法,但在我的脑海中有一个问题:如果我正在编写所有的托管代码,实现IDisposable接口有意义吗?

我知道何时以及如何使用Idisposible,但我的问题是,如果我编写的所有托管代码都是一个简单的类,那么如果我在这个类中实现IDisposable并进行一些清理,比如释放一些全局值,这有意义吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-12 01:40:08

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

  1. 你的类有很多对象,有很多交叉引用。即使都是托管的,GC也可能无法回收内存,因为引用是活动的。您有机会(而不是编写终结器)来解开引用,并按照附加的方式拆分链接。因此,您正在帮助GC回收内存。
  2. 您打开了一些流,这些流在类的对象死之前一直是活动的。尽管这样的文件/网络等实现是托管的,但它们深入到Win32模式中的句柄。因此,您有机会编写一个Dispose方法,您可以在其中关闭流。
  3. 你正在编写一个使用非托管资源的类,并且你想把你的程序集发送给第三方。最好使用disposable pattern来确保能够释放句柄,从而避免leakage.
  4. Thanks to supercat :您的类实现了大量的事件处理程序,并将它们与事件挂钩。暴露事件的类的对象,如Form等,不会被GC释放,因为您的类的本地实现(可能)仍然挂接到这些事件中。您可以在Dispose中解除这些事件处理程序的连接;这也有助于GC。

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

票数 11
EN

Stack Overflow用户

发布于 2010-10-12 01:26:45

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

票数 7
EN

Stack Overflow用户

发布于 2010-10-12 01:21:08

如果您有一个需要回收的资源(比如文件),那么您希望拥有IDisposible,以便显式地关闭它,而不是等待GC来完成它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3908463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档