我加载了一个 LiefItems 列表。
List<LiefItem> list = this.LoadLiefItems();
LiefItem 以这种方式实现 INotifyPropertyChanged:
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) {
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
加载列表后,我订阅 PropertyChanged:
foreach(var item in list) {
item.PropertyChanged += ItemOnPropertyChanged;
}
之后,List 将用作 DataGrid 的 ItemsSource。
我现在问我,如果第二次加载列表并将新列表设置为我的 DataGrid 的 ItemsSource,第一个加载的项目是否从内存中删除,或者我是否有 MemoryLeak 因为我订阅了 PropertyChanged 而没有取消订阅?
最佳答案
那里没有内存泄漏。
C# 事件实现 subject-observer下面的图案。
当引发事件时,实际发生的是对注册到该事件的对象的成员方法的调用。
因此,如果您执行以下操作:
item.PropertyChanged += ItemOnPropertyChanged;
这相当于:
item.PropertyChanged += this.ItemOnPropertyChanged;
当事件被触发时,会调用该方法:
registeredObject.ItemOnPropertyChanged(propertyName);
这意味着为注册事件的对象存储了一个引用。不是引发事件的对象。
关于c# - 是否存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26552192/