c# - 是否存在内存泄漏?

标签 c# wpf memory-leaks datagrid

我加载了一个 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/

相关文章:

c# - 如何使用MVVM打开对话框

Android Webview GIF 堆随着时间的推移急剧增长

c# - 需要将一列分成两列

c# - 在最后一个特殊字符后删除字符

c# - Xamarin 应用程序崩溃调用 HTTPS

c++ - 在 Visual Studio 中,与 std::async 一起使用时未调用 `thread_local` 变量的析构函数,这是错误吗?

android - Eclipse Memory Analyzer 主饼图中的 Remainder 是多少?

C# Web API 基于 GET 请求的 XML 或 JSON

c# - 获取 ListViewItem 子项

c# - WPF DataGrid 性能问题