【发布时间】:2015-03-15 18:43:48
【问题描述】:
这个问题可能会导致推测性的答案,但我认为在c# 中实现event 背后有一个深思熟虑的设计决策。
只要事件的发布者还活着,c# 中的事件模式就会使订阅者保持活跃。因此,如果您不取消订阅,您就是在泄漏内存(嗯,不是真的泄漏 - 但内存仍然被不必要地占用)。
如果我想阻止这种情况,我可以取消订阅事件或将弱事件模式实现为proposed at MSDN。
由于事件模式导致了这么多问题(对于初学者?),问题是:为什么决定发布者保留对订阅者的强引用,而不是让它们独立或允许开发者明确地拥有 @ 987654326@ 或 weak 修饰符?
这里已经有几个questions 关于这个话题,答案听起来很合理,但没有人真正回答为什么会这样。
【问题讨论】:
-
因为在.NET 1.0中引入的事件和Winforms(开始时的主要用户),在一个古老的时代,然后它们不能在不破坏一切的情况下进行修改?如果我必须选择一个如果在 1.0 中引入会使 .NET 成为更好的框架的功能,那么泛型和可空值就是该功能。
-
真的给初学者带来这么多问题吗?你有证据或文件吗?
-
大多数情况下它是一个红鲱鱼。无论如何,事件都是一种混乱的依赖模式,当你明智地使用时,不会出现泄漏问题。
-
@HenkHolterman 没有研究,但从这里以及网络上围绕该主题的教程和问题的数量来看,我认为这是一个问题。
-
“因此,如果您不取消订阅,则会泄漏内存” - 如果订阅者的寿命比订阅者长。根据我的经验,这种情况并不常见。我曾经被这个咬过,正好一次,但仅此而已。
标签: c# c# c# .net events weak-references