Мне интересно, будет ли приведенный ниже код вызывать утечку: Класс Parent
имеет список класса Child
. Child
объекты используют PropertyChangedEventManager.AddHandler
, чтобы получать уведомления об изменениях свойств в агрегирующем Parent
объекте. Если эти агрегированные экземпляры никогда не вызовут RemoveHandler
, вызовет ли это утечку?
Я понимаю, что G C основан на достижимости, а не на подсчете ссылок , но, очевидно, на PropertyChangedEventManager
поддерживает список подписчиков обработчиков где-нибудь. Так как же очистить этот список, если я не позвоню RemoveHandler
?
Что-то вроде этой заведомо упрощенной версии того, что делает мой код:
public class Parent : INotifyPropertyChanged
{
public Parent()
{
_children = new List<Child>();
_children.Add(new Child(this));
}
public event PropertyChangedEventHandler PropertyChanged;
public bool Value
{
get => _value;
set
{
_value = value;
PropertyChanged?.Invoke(new PropertyChangedEventArgs("Value"));
}
}
private List<Child> _children
}
public class Child
{
public Child(Parent parent)
{
// Will failing to undo this with RemoveHandler cause a leak?
PropertyChangedEventManager.AddHandler(r, OnValueChange, "Value");
}
void OnValueChanged(object sender, PropertyChangedEventArgs e)
{
// Do something...
}
}