如果分配了新集合,是否需要取消订阅ObservableCollection中项目的事件?

问题描述 投票:1回答:1

据我所知(正如SO上的许多帖子所述,您应该始终取消订阅事件,以避免泄漏。但是我想知道以下情况:

ObservableCollection<myClass> myCollection = new ObservableCollection();

// add items....

foreach(var item in myCollection)
{
   item.somePropertyChanged += OnSomethingChanged;
}

// work with the collection...

// new we just assign a new collection to the existing collection
myCollection = new ObservableCollection<myClass>(someNewListOfMyClass);

我是否必须手动取消订阅所有已删除的项目,或者在这种情况下GC是否会收集它们而不取消订阅?

c# events
1个回答
1
投票

这些项目不是被删除(至少不是立即删除)。您不知道when GC最终将删除所有这些项目(并且只有在其他地方没有其他引用的情况下,它才会这样做)。

并且只要这些项目存在于内存中,它们就可能引发事件并执行您的OnSomethingChanged处理程序。

但是,订阅item.SomePropertyChanged不会生成对item的引用,该引用将阻止GC销毁它。而是创建对您的实例的引用,该引用声明OnSomethingChanged

© www.soinside.com 2019 - 2024. All rights reserved.