web-dev-qa-db-fra.com

Affectation de Null supprimer tous les gestionnaires d'événements 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énements suivant que j'ai souscrit à

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

Définira mon député à NULL comme suit Supprimer le gestionnaire d'événements?

call_ = null;

ou je dois vous désabonner avec - =?

32
Dor Cohen

oui, vous devriez utiliser surchargé -= Pour vous désabonner d'un événement.

il suffit d'attribuer une référence à null ne le fera pas automatiquement. L'objet va toujours écouter cet événement.

30
Azodious

Vous devez toujours vous désabonner de vos manutentionnaires d'événement par - = avant de régler sur NULL ou de disposer de vos objets (la simple définition de la variable sur NULL ne vous désabonnera pas tous les gestionnaires), comme indiqué dans l'extrait MSDN ci-dessous:

Pour empêcher que votre gestionnaire d'événements soit invoqué lorsque l'événement est soulevé, simplement vous désabonner de l'événement. Afin de prévenir les fuites de ressources, il est important de se désabonner d'événements avant de disposer d'un objet d'abonné. Jusqu'à ce que vous vous désinscrivez d'un événement, le délégué de multidiffusion qui sous-tend l'événement de l'objet de publication a une référence au délégué qui encapsule le gestionnaire d'événements de l'abonné. Tant que l'objet de publication contient cette référence, votre objet d'abonné ne sera pas recueilli.

expliqué au lien ci-dessous dans la section Unsubscribing:

Comment: S'abonner et vous désabonner des événements (Guide de programmation C #

Plus d'informations à:

pourquoi vous devriez toujours ne pas connecter les gestionnaires d'événements

8
VS1

Vous devez utiliser l'opérateur d'attribution de soustraction (- =) à Se désabonner d'un événement. Ce n'est qu'après que tous les abonnés se sont désabonnés à partir d'un événement, l'instance d'événement dans la classe Editeur est définie sur NULL.

Supprimer tous les événements, supposons que l'événement est un type "Action":

Delegate[] dary = TermCheckScore.GetInvocationList();

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