Подтвердить что ты не робот

Назначает ли null исключение всех обработчиков событий из объекта?

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

protected COMObject.Call call_ = null;

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

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

Будет ли мой член присвоен нулевому значению, как показано ниже, чтобы удалить обработчик событий?

call_ = null;

или я должен отказаться от подписки - =?

4b9b3361

Ответ 1

да, вы должны использовать перегруженный -=, чтобы отменить подписку на событие.

простое назначение ссылки на null не будет делать это автоматически. Объект все равно будет прослушивать это событие.

Ответ 2

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

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

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

Как подключиться и отменить подписку на события (Руководство по программированию на С#)

Дополнительная информация:

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

Ответ 3

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

Ответ 4

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

Delegate[] dary = TermCheckScore.GetInvocationList();

if ( dary != null )
{
    foreach ( Delegate del in dary )
    {
        TermCheckScore -= ( Action ) del;
    }
}