Ne affectation de la valeur null supprimer tous les gestionnaires d'événements à partir d'un objet?
J'ai défini un nouveau membre dans ma classe
protected COMObject.Call call_ = null;
Cette classe a le gestionnaire d'événement suivant que je me suis abonné à
call_.Destructed += new COMObject.DestructedEventHandler(CallDestructedEvent);
Sera la configuration de mon membre à la valeur null comme suit supprimer le gestionnaire d'événements?
call_ = null;
ou je désabonné avec -=?
Vous devez vous connecter pour publier un commentaire.
oui, vous devez utiliser surchargé
-=
pour vous désabonner d'un événement.tout simplement l'attribution d'une référence à
null
ne sera pas le faire automatiquement. L'objet sera toujours à l'écoute de cet événement.call_
n'est pas la valeur null, seulementcall_
, qui est seulement une référence à cela, il pourrait y en avoir d'autres et en effet il y a (dans le cas des gestionnaires eux-mêmes). Tout se résume au fait que nous ne fixons pas les objets null, nous avons défini des références à null.Vous devriez toujours vous désabonner de vos gestionnaires d'événements par -= avant la mise à null, ou d'en disposer vos objets (il suffit de réglage de la variable à null pas de vous désinscrire de tous les gestionnaires), comme indiqué dans le MSDN extrait ci-dessous:
Pour éviter que votre gestionnaire d'événement d'être appelée lorsque l'événement est déclenché, il suffit de vous désabonner à partir de l'événement. Afin de prévenir les fuites de ressource, il est important pour vous désabonner des événements avant de vous débarrasser d'un objet de l'abonné. Jusqu'à ce que vous désabonner à partir d'un événement, le délégué multicast qui sous-tend l'événement dans l'édition de l'objet a une référence au délégué qui encapsule l'abonné du gestionnaire d'événement. Tant que la publication d'objet contient que la référence de votre objet de l'abonné ne seront pas nettoyés.
expliqué dans le lien ci-dessous dans le
Unsubscribing
section:Comment faire: s'Abonner et de se Désabonner à partir d'Événements (Guide de Programmation C#)
Plus d'informations sur:
Pourquoi vous devriez toujours unscubscribe des gestionnaires d'événements
Vous devez utiliser la soustraction opérateur d'affectation (-=) pour se désabonner à partir d'un événement. Seulement après que tous les abonnés ont désabonné à partir d'un événement, l'événement de l'instance dans l'éditeur de la classe est définie sur null.
Supprimer tous les événements, supposons que l'événement est une "Action" de type:
TermCheckScore
comme un domaine-comme-événement, alors vous devez être à l'intérieur le déclarant type; dans ce cas: il suffit de le mettre à null.TermCheckScore = null;
ferait tout ce qu'il fait, mais beaucoup beaucoup plus efficacement.