gpt4 book ai didi

c# - 为什么总是需要在具有 IDisposable 成员的对象上实现 IDisposable?

转载 作者:太空狗 更新时间:2023-10-29 23:54:08 24 4
gpt4 key购买 nike

据我所知,这是一个公认的规则,如果你有一个具有 IDisposable 成员 m 的类 A,A 应该实现 IDisposable 并且它应该在其中调用 m.Dispose()。

我找不到令人满意的理由来解释为什么会这样。

我理解以下规则:如果您拥有非托管资源,则应提供终结器和 IDisposable,这样如果用户未显式调用 Dispose,终结器仍会在 GC 期间进行清理。

但是,有了该规则,您似乎不需要拥有该问题所涉及的规则。例如……

如果我有一个类:

class MyImage{
private Image _img;
... }

惯例规定我应该有 MyImage : IDisposable。但是,如果 Image 遵循约定并实现了终结器,而我不关心资源的及时释放,那又有什么意义呢?

更新

here 找到了关于我试图得到什么的很好的讨论.

最佳答案

But if Image has followed conventions and implemented a finalizer and I don't care about the timely release of resources, what's the point?

您完全忽略了 Dispose 的要点。这与的方便无关。这与可能想要使用那些非托管资源的其他组件 的便利性有关。除非你能保证系统中没有其他代码关心资源的及时释放,用户也不关心资源的及时释放,否则你应该释放你的资源尽快。这是礼貌的做法。

中经典Prisoner's Dilemma ,在合作者的世界中,一个孤独的叛逃者获得了巨大的利益。但在你的情况下,作为一个孤独的叛逃者只会产生很小的好处,即你个人通过编写低质量、忽略最佳实践的代码来节省几分钟。受害的是您的用户和他们使用的所有程序,而您几乎一无所获。您的代码利用了其他程序解锁文件和释放互斥量以及所有这些东西的事实。做一个好公民,为他们做同样的事情。这并不难做到,而且它使整个软件生态系统变得更好。

更新:这是我的团队目前正在处理的真实情况的示例。

我们有一个测试工具。它有一个“句柄泄漏”,因为一堆非托管资源没有被积极处理;每个“任务”可能会泄漏六个句柄。当它发现禁用的测试等时,它会维护一个“待办任务”列表。我们在这个列表中有 10 或 20000 个任务,所以我们很快就会得到这么多未完成的句柄——应该死掉并释放回操作系统的句柄——很快系统中没有任何代码是 < em>不相关测试可以运行。测试代码不关心。它工作得很好。但最终正在测试的代码无法创建消息框或其他 UI,整个系统要么挂起要么崩溃。

垃圾收集器没有理由知道它需要更积极地运行终结器以更快地释放这些句柄;为什么要呢?它的工作是管理内存。 的工作是管理句柄,因此您必须完成这项工作。

关于c# - 为什么总是需要在具有 IDisposable 成员的对象上实现 IDisposable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6101499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com