如here所述,PropertyChangedEventManager
类
提供一个WeakEventManager实现,以便您可以使用“弱事件侦听器”模式为PropertyChanged事件附加侦听器。
有两种方法来订阅属性更改:
void AddHandler (INotifyPropertyChanged source, EventHandler<PropertyChangedEventArgs> handler, string propertyName)
void AddListener (INotifyPropertyChanged source, IWeakEventListener listener, string propertyName)
他们最终都调用了相同的方法:
private void AddListener(INotifyPropertyChanged source, string propertyName, IWeakEventListener listener, EventHandler<PropertyChangedEventArgs> handler)
listener
或handler
设置为空。
我需要使用强事件处理程序(即source.PropertyChange += handler;
)更改一些代码以遵循弱模式。使用AddHandler
方法很简单。有什么理由偏爱AddListener
(这需要我实施IWeakEventListener
)吗?
如果我要编写新代码,为什么要优先选择一个?
答案 0 :(得分:2)
AddHandler(...
仅是.Net 4.5功能,它可以简化常见情况下的代码。 因此,如果满足要求,则是更好的选择。
.Net4.5之前只有:
AddListener(...
您可以在以下资源中找到更多信息:
...不再需要创建自定义WeakEventManager或实现IWeakEventListener ...
在WPF 4.5 RC中,改进了弱事件模式。此外 侦听器,WeakEventManagers还支持Handlers。处理程序是 定义为事件处理程序,但我们的类无需实现 特定的界面。另外,因为没有硬性参考 维护,没有可能的内存泄漏。
根据我的经验,这些解决方案不是防弹的,如果您或您团队中的某人使用lambda-expression作为处理程序,您仍然会发生内存泄漏。
使用lambda表达式时,编译器会生成匿名类以充当目标(新生成的类包装lambda表达式)。 GC将立即收集对该类的不足引用。
这是Thomas Levesque explanation:
特殊情况:匿名方法处理程序如果您要订阅 具有匿名方法(例如lambda表达式)的事件,请确保 保留对处理程序的引用,否则也会被收集 很快...
p.s我最终使用了与Thomas Levesque解决方案类似的方法,并且为了保护团队免于lambda的注册,我检查了每个处理程序(是否具有匿名方法)(进行了反思)。如果是的话,我抛出异常-开发人员立即知道这是不可接受的,然后更改他们的代码。