为什么在 WPF 中实现 INotifyPropertyChanged 可以避免内存泄漏?

Gab*_*ton 5 c# wpf memory-leaks

我读到了如何通过仅绑定实现 INotifyPropertyChanged 或它们是 DependencyObject 对象的属性来避免Windows Presentation Foundation应用程序中的内存泄漏。但是如何让 CLR 收集这些对象呢?

来源信息:

WPF 绑定实际上会导致内存泄漏。经验法则是始终绑定到 DependencyObject 或 INotifyPropertyChanged 对象。如果您不这样做,WPF 将从静态变量创建对绑定源(即 ViewModel)的强引用,从而导致内存泄漏(https://michaelscodingspot.com/ways-to-cause-memory-leaks-在-dotnet/

Joh*_*n C 5

如果某个属性未实现 INotifyPropertyChanged 接口,那么 WPF 框架将通过订阅 PropertyDescriptor.ValueChanged 事件来愚蠢地为您添加一个属性。由于 WPF 和 CLR 不知道何时处理/取消订阅事件,因此它永远保留该属性。并且由于正在引用该属性,因此无法对其进行垃圾收集。包含该属性的类的整个实例永远保留在内存中,从而导致内存泄漏。