Удаляет ли присвоение null все обработчики событий объекта?

Я определил новый член в своем классе

protected COMObject.Call call_ = null;

Этот класс имеет следующий обработчик событий, на который я подписался

call_.Destructed += new COMObject.DestructedEventHandler(CallDestructedEvent);

Установка моего члена в null, как указано ниже, удалит обработчик событий?

call_ = null;

Или я должен отменить подписку с -=?

30
задан Dor Cohen 13 September 2012 в 08:48
поделиться

3 ответа

Вы всегда должны отписываться от своих обработчиков событий с помощью - = перед установкой на null или удалением своих объектов (просто установка переменной на null не отменит все обработчики), как указано в выдержке из MSDN ниже:

Чтобы предотвратить вызов вашего обработчика события при возникновении события, просто отмените подписку на событие. Чтобы предотвратить утечку ресурсов, важно отменить подписку на события, прежде чем избавляться от объекта подписчика. Пока вы не отмените подписку на событие, многоадресный делегат, лежащий в основе события в объекте публикации, имеет ссылку на делегат, который инкапсулирует обработчик событий подписчика. Пока объект публикации содержит эту ссылку, ваш объект подписчика не будет собирать мусор.

объяснено по ссылке ниже в разделе Unsubscribing:

Как: подписываться на события и отписываться от них (Руководство по программированию в C #)

Больше информации на :

Почему вы всегда должны отписываться от обработчиков событий

8
ответ дан 28 November 2019 в 00:11
поделиться

Вы должны использовать оператор назначения вычитания (- =) - отменить подписку на событие. Только после того, как все подписчики отписались от события, для экземпляра события в классе издателя устанавливается значение NULL.

1
ответ дан 28 November 2019 в 00:11
поделиться

Удалить все события, предположим, что это тип «Действие»:

Delegate[] dary = TermCheckScore.GetInvocationList();

if ( dary != null )
{
    foreach ( Delegate del in dary )
    {
        TermCheckScore -= ( Action ) del;
    }
}
1
ответ дан 28 November 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: