c# - PropertyChangedEventManager:AddHandler 与 AddListener
问题描述
如此处所述,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
)?
如果我要编写新代码,那么偏爱其中一个的原因是什么?
解决方案
AddHandler(...
只是 .Net 4.5 的一个功能,它可以为常见情况简化您的代码。因此,如果满足要求,是更好的选择。
在.Net4.5之前只有:
AddListener(...
您可以在以下来源中找到更多信息:
...不再需要创建自定义 WeakEventManager 或实现 IWeakEventListener...
在 WPF 4.5 RC 中,弱事件模式得到了改进。除了监听器,WeakEventManagers 也支持 Handlers。处理程序的定义类似于事件处理程序,但我们的类不需要实现特定的接口。另外,由于没有维护硬引用,因此没有可能的内存泄漏。
边注:
根据我的经验,这些解决方案并不是万无一失的,如果您或您团队中的某个人使用 lambda-expression 作为处理程序,您仍然可能会出现内存泄漏。
使用 lambda 表达式时,编译器生成匿名类作为目标(新生成的类包装 lambda 表达式)。GC 将立即收集对此类的弱引用。
特殊情况:匿名方法处理程序 如果您使用匿名方法(例如 lambda 表达式)订阅事件,请确保保留对处理程序的引用,否则它会很快被收集...
ps 我最终使用了与Thomas Levesque解决方案类似的方法,并且为了保护团队免于向 lambda 注册,我检查(通过反射)每个处理程序是否是匿名方法。如果是,我抛出一个异常——所以开发人员立即知道这是不可接受的,并更改他们的代码。
推荐阅读
- javascript - 将类添加到第一个动态创建的 li 标签
- angular - Angular 代理在本地主机上工作,但在生产中不工作
- sql - 通过 1 个脚本/文件创建多个视图
- sql - 您如何基于在任一表中具有不同字段的主键来联合 2 个表?
- javascript - 更改谷歌帐户后反应本机firestore不上传数据
- azure - Azure DevOps Pipeline:是否可以将构建部署到 Azure 以外的其他服务?
- odata - o为 VizFrames 展开数据
- android - isOpen 函数对 Room 数据库或 SQLite 有效吗?
- json - 使用 Microsoft-Avro-Core 进行序列化时包括命名空间属性
- wikipedia - 从 Wikipedia 页面获取干净的摘录