Поскольку PPMM
является долгоживущим объектом (синглтоном), то этот код не имеет особого смысла.
Проблема здесь в том, что, пока этот обработчик событий ссылается на объект, он не будет иметь права на сборку мусора , по крайней мере, пока этот другой объект, которому принадлежит событие, жив.
Таким образом, помещать что-либо в деструктор бессмысленно, например:
- Обработчик событий уже удален, поэтому объект получил право на сборку мусора
- Обработчик событий не удален, владелец объекта не подходит для сборки мусора, и, следовательно, финализатор никогда не будет вызван
- Оба объекта имеют право на сборку мусора, и в этом случае вам вообще не следует обращаться к этому другому объекту в финализаторе, поскольку вы не знаете его внутреннего состояния
Короче говоря, не делайте этого .
Теперь можно добавить другой аргумент о добавлении такого кода в метод Dispose
, когда вы реализуете IDisposable
. В этом случае это полностью имеет смысл, поскольку его код пользователя, вызывающий Dispose
, находится в предопределенной и контролируемой точке.
Финализатор (деструктор), однако, вызывается только тогда, когда объект имеет право на сборку мусора и имеет финализатор, и в этом случае нет смысла.
Что касается вопроса nbr. 2, который я принимаю как «Могу ли я отписаться от подобных событий», тогда да, вы можете. Единственный раз, когда вам нужно держаться за делегата, на которого вы подписались, это когда вы создаете делегата вокруг анонимного метода или лямбда-выражения. Когда вы создаете его вокруг существующего метода, он будет работать.
Редактировать : WPF. правильно, не видел этот тег. Извините, остальная часть моего ответа не имеет большого смысла для WPF, и, поскольку я не гуру WPF, я не могу сказать точно. Тем не менее, есть способ это исправить. Здесь, на SO, вполне законно вмешиваться в содержание другого ответа, если вы можете улучшить его. Поэтому, если кто-то знает, как правильно сделать это с помощью пользовательского контроля WPF, вы можете поднять весь первый раздел моего ответа и добавить соответствующие фрагменты WPF.
Редактировать : Позвольте мне также ответить на вопрос в комментарии здесь.
Поскольку рассматриваемый класс является пользовательским элементом управления, его время жизни будет привязано к форме. Когда форма закрывается, она удаляет все дочерние элементы управления, которыми она владеет, другими словами, здесь уже есть метод Dispose .
Правильный способ обработки этого пользовательского элемента управления, если он управляет своими собственными событиями, - это отцепить обработчики событий в методе Dispose.
(остальные удалены)