我有一个多播委托字典,其中密钥是特定的消息类型,值是多播委托,即消息处理程序。
当我想要清除该字典时,我想确保所有代理都是未绑定和解除引用并最终收集垃圾 - 是否足以清除字典或者我应该枚举值(多播委托)并将它们设置为null首先清理字典?
答案 0 :(得分:1)
除非你有一个反例(在这种情况下你应该用MS打开一个bug报告),.NET中的垃圾收集不应该是一个问题。它相当复杂,可以跟踪代码中未引用的对象,即使它们是从运行图像中未引用的任意大对象图的一部分。
即便如此,清除字典并将其所有值设置为null之间没有区别。两者都具有简单地解除引用基础值的相同效果。这太过分了。
.NET真正关心的不是引用安全性,而是资源泄漏:任何IDisposable类都应该在解除引用之前处理掉。但是,MulticastDelegate
不是一次性类,所以这没有实际意义。
换句话说:这是.NET,而不是C.压力更小。别担心。
答案 1 :(得分:0)
System.Delegate(和System.MulticastDelegate)类的处理方式与任何其他类的处理方式相同,它们恰好包含指向函数和目标对象的指针。因此,对于所有意图和目的,您可以将其视为对目标对象的引用。
如果你已经完成它们只是清除字典,如果你完成了包含对象,你甚至不需要这样做。将它们单独设置为null将无法清除字典中的任何内容。
一旦任何对象不再可达,它就有资格进行垃圾收集,如果你不熟悉垃圾收集机制那么我强烈建议你仔细阅读一下这个主题。
答案 2 :(得分:-1)
将它们设置为null。
foreach (var d in dict)
{
d = null;
}
当编译器不再引用这些内容时,它会为你收集它。
最终,只需将整个dict设为null:
dict = null;
C#中的垃圾收集应该不是问题。