据我所知(正如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是否会收集它们而不取消订阅?
这些项目不是被删除(至少不是立即删除)。您不知道when GC最终将删除所有这些项目(并且只有在其他地方没有其他引用的情况下,它才会这样做)。
并且只要这些项目存在于内存中,它们就可能引发事件并执行您的OnSomethingChanged
处理程序。
但是,订阅item.SomePropertyChanged
不会生成对item
的引用,该引用将阻止GC销毁它。而是创建对您的实例的引用,该引用声明OnSomethingChanged
。