Удаляет ли назначение null все обработчики событий из объекта? - PullRequest
29 голосов
/ 17 января 2012

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

protected COMObject.Call call_ = null;

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

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

Будет ли установка моего члена в null следующим образом удалитьобработчик событий?

call_ = null;

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

Ответы [ 4 ]

30 голосов
/ 17 января 2012

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

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

8 голосов
/ 17 января 2012

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

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

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

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

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

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

1 голос
/ 20 декабря 2013

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

Delegate[] dary = TermCheckScore.GetInvocationList();

if ( dary != null )
{
    foreach ( Delegate del in dary )
    {
        TermCheckScore -= ( Action ) del;
    }
}
1 голос
/ 17 января 2012

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

...