在为我们正在开发的某些组件编写API时,我们需要公开一些只读POCO对象,用户可以(并且很可能会)在其应用程序中创建数据模板,因此他们将使用绑定到他们。
现在,我知道您可以绑定到直接的POCO对象(即不是DependencyObject
的子类),即使它们没有实现INotifyPropertyChanged
,但在您这样做时,除非您将这些绑定明确标记为一个时间,您正在创建对对象的不必要的引用,并可能暴露内存泄漏。
摘录自this article:
[...]这有2个含义,此操作导致公共语言运行库(CLR)创建从此PropertyDescriptor对象到对象X的强引用。CLR还在全局表中保留对PropertyDescriptor对象的引用
现在,尽管我们可以尝试记录所有与这些对象的绑定应该是一次性的,但这会给消费者带来负担。我想知道,即使没有任何专门更改来防御内存泄漏的更改,仅实施INotifyPropertyChanged
是否有意义。
换句话说,更重的是绑定到POCO属性而不使用一次,还是防御性地实现INotifyPropertyChanged
?
这样做有不利之处吗?尽管不如一次性绑定那么轻巧,但它仍必须优于消费者 not 将它们设置为一次性绑定所带来的效果。
如果有什么不同,那么其中只有一百个左右,所以很小。
答案 0 :(得分:0)
这样做有不利之处吗?
不利之处可以忽略不计。显然,内存损失很小。除了需要在POCO类中定义PropertyChanged
事件之外,WPF还将订阅该事件,这将根据您的CPU体系结构分配额外的4或8个字节。但这不是没有实现接口的真正理由。
因此,如果您担心内存泄漏,并且知道并非所有与类属性的绑定都将定义为OneTime
,那么将接口实现为对此的保护并不会有任何害处。您可能想在代码中留下注释,以说明尽管从未引发过事件,但为什么仍实现了接口。