【发布时间】:2013-09-09 23:13:53
【问题描述】:
首先,如果这被认为是重复的,很抱歉 - 我知道这是一个常见的话题,但我已经查看并没有找到满意的答案。
有很多问题询问何时使用IDisposable,但从我读过的所有内容来看,我只是不明白为什么你不会在你制作的每个类中实现它.有什么可失去的?它对性能有很大影响吗?
我对@987654324@ 的部分理解是它所做的其中一件事是: Dispose()ing other IDisposables owned by the object。请原谅我的无知,但这仅适用于给定对象的字段/属性,还是也扩展到在其方法中创建的对象?
例如,如果在实现IDisposable 的类中的方法内创建了Font,但Font 没有使用using 块初始化,或者.Dispose()d 在末尾显式初始化方法;当它的IDisposable parent/class 被 GCd/disposed 时,它会被处理掉吗?否则,Font 是否永远不会被处置?
我并不是要跑题,但如果它确实会像这样“包罗万象”(有效地处理任何错误的子 IDisposable 对象,否则这些对象将不会被处理),不是仅凭这个理由就足以证明总是尽可能实施IDisposable?
【问题讨论】:
-
嗯,是的。如果您需要释放资源.. 遵循已经建立的模式。实现
IDisposable.. -
查看这个问题,它提出了相反的问题。 IDisposable 应该仅在您真正需要时才实施(特别是因为如何正确实施它并不明显)stackoverflow.com/questions/1125693/…
-
一般来说,我发现我很少需要保留长期存在的 IDisposable 实例,尤其是在使用 async/await 的情况下,因此为每个实例实现 IDisposable 将是非常过分的。并非所有类都是 UI 类。
-
感谢大家的 cmets...@SimonWhitehead:虽然您的逻辑毫无疑问,但恐怕我发现它并不能真正回答我的问题。
-
@Alfie:如果您通过在方法中创建 Font 而不进行处置而丢失了对 IDisposable 对象的引用,那么您将无能为力。如果丢失的 IDisposable 被正确实现,那么 GC 对终结器的调用应该会清理干净。
标签: c# .net memory-management memory-leaks idisposable