有记忆泄漏吗?

Ben*_*ual 1 c# wpf datagrid memory-leaks

我加载了一个LiefItems列表.

List<LiefItem> list = this.LoadLiefItems();
Run Code Online (Sandbox Code Playgroud)

LiefItem正在以这种方式实现INotifyPropertyChanged:

public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName) {
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null) {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

加载List后,我订阅了PropertyChanged:

foreach(var item in list) {
    item.PropertyChanged += ItemOnPropertyChanged;
}
Run Code Online (Sandbox Code Playgroud)

之后,List将用作DataGrid的ItemsSource.

我现在问我,如果第二次加载列表并将新List设置为我的DataGrid的ItemsSource,是从Memory中删除的第一个加载项,还是我有MemoryLeak因为我订阅了PropertyChanged并且没有取消订阅?

Ell*_*hen 5

那里没有内存泄漏.

C#事件在下面实现了主题观察者模式.

引发事件时,实际发生的事情是调用注册到事件的对象的成员方法.

所以,如果你做的事情如下:

 item.PropertyChanged += ItemOnPropertyChanged;
Run Code Online (Sandbox Code Playgroud)

这相当于:

 item.PropertyChanged += this.ItemOnPropertyChanged;
Run Code Online (Sandbox Code Playgroud)

当事件被触发时,会调用该方法:

registeredObject.ItemOnPropertyChanged(propertyName);
Run Code Online (Sandbox Code Playgroud)

这意味着为注册事件的对象存储了引用.不是引发事件的对象.