Ответ 1
да, вы должны использовать перегруженный -=
, чтобы отменить подписку на событие.
простое назначение ссылки на null
не будет делать это автоматически. Объект все равно будет прослушивать это событие.
Я определил новый член в своем классе
protected COMObject.Call call_ = null;
Этот класс имеет следующий обработчик событий, на который я подписался на
call_.Destructed += new COMObject.DestructedEventHandler(CallDestructedEvent);
Будет ли мой член присвоен нулевому значению, как показано ниже, чтобы удалить обработчик событий?
call_ = null;
или я должен отказаться от подписки - =?
да, вы должны использовать перегруженный -=
, чтобы отменить подписку на событие.
простое назначение ссылки на null
не будет делать это автоматически. Объект все равно будет прослушивать это событие.
Вы всегда должны отказаться от подписки на обработчики событий: - = перед установкой на нуль или удаление объектов (просто установка переменной в значение null не отменяет подписку на все обработчики), как указано в выдержке MSDN ниже:
Чтобы предотвратить запуск обработчика события при возникновении события, просто отмените подписку на событие. Чтобы предотвратить утечку ресурсов, важно отказаться от подписки на события перед тем, как избавиться от объекта-подписчика. Пока вы не отмените подписку на событие, делегат многоадресной передачи, который лежит в основе события в объекте публикации, имеет ссылку на делегата, который инкапсулирует обработчик события абонента. Пока объект публикации сохраняет эту ссылку, ваш объект-подписчик не будет собирать мусор.
объясняется ниже в разделе Unsubscribing
:
Как подключиться и отменить подписку на события (Руководство по программированию на С#)
Дополнительная информация:
Почему вы всегда должны отменить рассылку обработчиков событий
Вы должны использовать оператор присваивания вычитания (- =) для отказаться от подписки от события. Только после того, как все подписчики отменили подписку на событие, экземпляр события в классе издателя имеет значение null.
Удалите все события, предположим, что это событие "Действие":
Delegate[] dary = TermCheckScore.GetInvocationList();
if ( dary != null )
{
foreach ( Delegate del in dary )
{
TermCheckScore -= ( Action ) del;
}
}