«La soustraction de délégué a un résultat imprévisible» dans ReSharper / C #?

Lors de l’utilisation de myDelegate -= eventHandler ReSharper (version 6) problèmes:

La soustraction des delegates a un résultat imprévisible

La raison derrière cela est expliquée par JetBrains ici . L’explication a du sens et, après l’avoir lue, je doute de toutes mes utilisations - delegates.

Comment alors ,

  • Puis-je écrire un événement non automatique sans rendre ReSharper grincheux?
  • ou existe-t-il un moyen meilleur et / ou “correct” de le mettre en œuvre?
  • ou puis-je ignorer ReSharper?

Voici le code simplifié:

 public delegate void MyHandler (object sender); MyHandler _myEvent; public event MyHandler MyEvent { add { _myEvent += value; DoSomethingElse(); } remove { _myEvent -= value; // <-- ReSharper warning here } } 

    N’ayez pas peur! La première partie de l’avertissement de ReSharper s’applique uniquement à la suppression des listes de delegates. Dans votre code, vous supprimez toujours un seul délégué. La deuxième partie parle de la commande des delegates après la suppression d’un délégué en double. Un événement ne garantit pas un ordre d’exécution pour ses abonnés, donc cela ne vous affecte pas vraiment non plus.

    Comme la mécanique ci-dessus peut conduire à des résultats imprévisibles, ReSharper émet un avertissement chaque fois qu’il rencontre un opérateur de soustraction de délégué.

    ReSharper émet cet avertissement car la soustraction de délégué multidiffusion peut avoir des pièges, elle ne condamne pas entièrement cette fonctionnalité de langage. Heureusement, ces pièges sont en marge et il est peu probable que vous les renconsortingez si vous ne faites qu’instruire des événements simples. Il n’y a pas de meilleur moyen d’implémenter vos propres gestionnaires d’ add / remove , vous devez juste en prendre connaissance.

    Je suggère de rétrograder le niveau d’avertissement de ReSharper pour ce message à “Astuce” afin de ne pas être insensibilisé à leurs avertissements, qui sont généralement utiles.

    Vous ne devez pas utiliser directement les delegates pour additionner ou soustraire. Au lieu de cela votre champ

     MyHandler _myEvent; 

    Doit être plutôt déclaré comme un événement. Cela résoudra le problème sans risquer de compromettre votre solution tout en bénéficiant de l’utilisation des événements.

     event MyHandler _myEvent; 

    L’utilisation de delegate sum ou subtract est dangereuse car vous pouvez perdre des événements lorsque vous assignez simplement le délégué (selon la déclaration, le développeur ne déduira pas directement qu’il s’agit d’un délégué Multicast lorsqu’il est déclaré en tant qu’événement). Juste pour donner un exemple, si la propriété mentionnée sur cette question n’était pas signalée comme un événement, le code ci-dessous mettra les deux premières atsortingbutions à la valeur LOST, car quelqu’un simplement assigné au délégué (ce qui est également valable!).

     myObject.MyEvent += Method1; myObject.MyEvent += Method2; myObject.MyEvent = Method3; 

    Lors de l’atsortingbution de Method3, j’ai complètement perdu les deux abonnements initiaux. L’utilisation de l’événement évite ce problème et supprime en même temps l’avertissement ReSharper.

    le définir sur = null au lieu d’utiliser – =