我将首先介绍有关事件和强引用的问题。复制自here
通常情况下,“主题”(具有事件的对象)具有比“观察者”(订阅事件的对象)更长的生命周期。当我们不再使用观察者时,我们希望它被垃圾收集;但是,如果观察者仍然订阅了关于主题的事件,则关联的事件处理程序保持对观察者的强引用,因此观察者将不会被垃圾收集,直到主体也变为垃圾,或直到观察者取消订阅。
遇到这个问题后,我一直在寻找解决方案。我已阅读MSDN中的Weak Event Patterns文章,并多次使用该模式。感到臃肿。我去寻找更好的东西,并发现了这两篇博文:
这使事情变得容易多了。所以现在我有一个简单的方法来使用弱事件订阅,我开始想知道,我何时应该使用弱事件?事实证明,我无法想到不使用弱事件的原因。
我的问题是:你什么时候希望主题能够有一个强有力的参考听众?在什么样的设计中,主体是保持听众活着的唯一因素是合乎逻辑/可取的。如果监听器在您的应用程序中完成某些任务,是不是总有一个“正常”的引用呢?
我正在通过WPF色眼镜看这个,并且对WPF相关的强引用使用特别感兴趣。但是,非WPF相关的答案也会受到赞赏,只是为了了解这些用途。
答案 0 :(得分:1)
public class MyForm : Form
{
public MyForm()
{
this.Closed += delegate
{
MessageBox.Show("If events were weak by default, you might never see this message.");
};
}
}
如果弱事件模式是.NET的一个更固有的部分,那将是很好的。
答案 1 :(得分:0)
这不是问题的答案。这只是试图让你停止殴打这匹特殊的死马。
为什么没有CLR支持弱事件?
A)对它们的需求不足。我不相信这是真的。看看WPF为支持它们而添加的丑陋臃肿。
B)WPF包含丑陋的膨胀以支持弱事件。如果有人能够迫使CLR团队最终为弱事件提供CLR支持,那么您认为WPF团队是否可以做到这一点?
因此:我们永远不会看到CLR对弱事件的支持。