【问题标题】:Drop reference when only a single link to it当只有一个链接时删除参考
【发布时间】:2015-04-28 15:07:12
【问题描述】:

我将代表列表存储在字典中,然后在需要时调用它们,问题是,当 UI 不再可见时,对代表的引用仍然存在,当 UI 再次出现时,它是一个新的例如,除了旧的引用之外,还添加了新的引用,因此调用了两倍的数量。

抛开设计问题不谈,有没有办法在存储引用时对引用施加约束,如果字典是唯一存储的地方,则丢弃它并返回 null?

【问题讨论】:

  • 你不知道 UI 什么时候会变得不可见吗?这将是删除所有对它的引用的好时机。
  • 有什么方法可以在字典中使用Weak Reference 来表示委托?
  • @Klors,我认为关闭 UI 是唯一的方法,WeakReference 不能保证它会在关闭 UI 和重新打开之间的空间中被删除。
  • @لَاإِلٰهَإِلَّاالله 你可以在再次打开用户界面之前强制垃圾收集

标签: c# reference garbage-collection


【解决方案1】:

当 UI 变得不可见时,最好的选择就是 .Clear() 字典

【讨论】:

  • 清除字典不起作用,我非常乐意分享说明原因的代码。清除它只会将其从字典中删除,并且由于 .NET 是一种引用计数语言,并且 UI 仍然拥有引用,因此委托仍然存在,现在您有了僵尸对象。
  • @RonBeyer 如果 OP 使用委托作为事件,那将是正确的。然后,您还需要取消订阅 Clear() 调用。从这个问题来看,它们是什么类型的委托并不明显,也许这只是在某个时间执行的单个操作,并且根本不会被 UI 持有。
  • @RonBeyer 只是挑剔一点,.NET 不进行引用计数。它使用 Mark&Sweep。
猜你喜欢
  • 2016-11-08
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 2021-05-05
  • 2020-05-19
相关资源
最近更新 更多