11
votes

Courte façon d'écrire un événement?

Généralement, nous utilisons ce code:

   public event EventHandler UpdateErrorIcons { add; remove; }


2 commentaires

C'est vraiment drôle, la plupart des gens n'ont même jamais entendu parler du code étendu :)


Ouais, même si j'ai vu des gens le faire, je n'utiliserai jamais personnellement cela, le compilateur l'ajoute plus tard.


3 Réponses :


15
votes

Oui. Débarrassez-vous du {Ajouter; supprimer; } code> partie et le champ de délégué de support et vous êtes GOLDEN:

private EventHandler _updateErrorIcons;
public event EventHandler UpdateErrorIcons
{
    add
    {
        EventHandler current, original;
        do
        {
            original = _updateErrorIcons;
            EventHandler updated = (EventHandler)Delegate.Combine(original, value);
            current = Interlocked.CompareExchange(ref _updateErrorIcons, updated, original);
        }
        while (current != original);
    }
    remove
    {
        // Same deal, only with Delegate.Remove instead of Delegate.Combine.
    }
}


4 commentaires

Et le champ de support. (En fait, op, vous trouverez que beaucoup de gens ne sont même pas au courant des Ajouter et supprimer accesseurs d'événements.)


Nous utilisons l'ADD & Supprimer dans certains événements pour la synchronisation.


@Carra: En fonction de la version du compilateur C # que vous utilisez, vous n'avez peut-être pas à vous soucier de cela: blogs.msdn.com/b/cburows/archive/2010/03/05 / ...


Bon de savoir. Je me souviens de lire les meilleures pratiques pour l'événement - Sécurité des threads lorsque nous étions toujours sur le cadre 2.0.



5
votes
yourObbject.UpdateErrorIcons += YourFunction;

0 commentaires

2
votes

Ajouter {} code> et Supprimer {} code> ne sont utilisés que dans des cas particuliers où vous devez gérer manuellement les connecteurs d'événements. US Sere Moritals Normalement utilisez-vous normalement Evénement public EventHandler UpdeckerErroricons; Code> Où "EventHandler" est le délégué de choix.

Par exemple: P>

public void InvokeMyEvent(string param1)
{
    MyEventDelegate myEventDelegate = MyEvent;
    if (myEventDelegate != null)
        myEventDelegate(this, param1);
}


2 commentaires

Oui, nous l'utiliserions généralement pour ajouter une synchronisation plus tard.


@Carra: À moins que je ne me trompe, la mise en œuvre par défaut de ajoutez et supprimer dans les dernières versions de la structure .NET incluent la synchronisation.