PropertyChangedEventManager:AddHandler与AddListener

时间:2018-08-30 08:32:12

标签: c# wpf events inotifypropertychanged

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)

listenerhandler设置为空。

我需要使用强事件处理程序(即source.PropertyChange += handler;)更改一些代码以遵循弱模式。使用AddHandler方法很简单。有什么理由偏爱AddListener(这需要我实施IWeakEventListener)吗?

如果我要编写新代码,为什么要优先选择一个?

1 个答案:

答案 0 :(得分:2)

AddHandler(...

仅是.Net 4.5功能,它可以简化常见情况下的代码。 因此,如果满足要求,则是更好的选择。

.Net4.5之前只有:

AddListener(...

您可以在以下资源中找到更多信息:

  1. Book - Introducing .NET 4.5

...不再需要创建自定义WeakEventManager或实现IWeakEventListener ...

  1. Blog post - Weak event pattern improvements

在WPF 4.5 RC中,改进了弱事件模式。此外 侦听器,WeakEventManagers还支持Handlers。处理程序是 定义为事件处理程序,但我们的类无需实现 特定的界面。另外,因为没有硬性参考 维护,没有可能的内存泄漏。


旁注:

根据我的经验,这些解决方案不是防弹的,如果您或您团队中的某人使用lambda-expression作为处理程序,您仍然会发生内存泄漏。

使用lambda表达式时,编译器会生成匿名类以充当目标(新生成的类包装lambda表达式)。 GC将立即收集对该类的不足引用。

这是Thomas Levesque explanation

特殊情况:匿名方法处理程序如果您要订阅 具有匿名方法(例如lambda表达式)的事件,请确保 保留对处理程序的引用,否则也会被收集 很快...

p.s我最终使用了与Thomas Levesque解决方案类似的方法,并且为了保护团队免于lambda的注册,我检查了每个处理程序(是否具有匿名方法)(进行了反思)。如果是的话,我抛出异常-开发人员立即知道这是不可接受的,然后更改他们的代码。

相关问题