11
votes

Pourquoi Generic Eventhandler est-il si sous-utilisé?

.NET 2.0 a ajouté le type EventHandler Type de délégué générique pour simplifier le processus d'écriture d'événements personnalisés; Au lieu d'avoir à définir une classe eventargs et son délégué correspondant (par exemple, myEventargs et myevenventharler ), vous n'avez besoin que d'écrire la classe args.

Gardant cela à l'esprit, pourquoi ce type de délégué n'apparaît presque nulle part dans la framework .NET? Je sais que la plupart des API essentielles ont été développées avant que des génériques aient été introduites, mais même dans de nouvelles parties du cadre telles que WPF, ils ont opté pour définir explicitement des types de délégués; par exemple. RouteteDeventHandler au lieu de EventHandler .

Y a-t-il quelque chose de malheureusement mal avec le délégué générique du gestionnaire d'événements? Je l'utilise souvent et je crains que mon code apparaisse très en place par rapport aux classes intégrées.


2 commentaires

Je soupçonne que l'introduction de EventHandler était juste un mauvais chronométrage. Au moment où il a été introduit, l'autre schéma (explicitement nommé des délégués) a été fermement établie et à la mise au point d'un changement de type générique de délégué aurait pu être considéré comme faisant un désordre encore plus grand (en conduisant à des programmeurs confus qui demandent, "Quoi Était-ce que ce délégué a été réparé à nouveau? FOOEVENTHANDLER ou EventHandler ? ") - Ce qui me rend curieux si le changement vers iEvent (introduit par F # et le cadre RX) fonctionnera.


WPF a été lancé en juillet 2003, bien avant que les génériques n'étaient disponibles. La même chose pour les formes Windows bien sûr.


4 Réponses :


5
votes

Je ne pense pas qu'il y ait rien de mal avec ça. Il est utilisé utilisé dans certains endroits de la framework ... dans géocoordinatewatcher.Position événement, tout comme exemple aléatoire.

C'est un peu maladroit de voir en code qu'un nom de type spécifique tel que RouteteDeventHandler - et comme vous allez utiliser RoudeDeventHandler A lot Dans WPF / Silverlight, c'est peut-être raison pour laquelle MM est décidé de lui donner son propre type.


0 commentaires

7
votes

juste un accident de l'histoire. Si nous avions des génériques dans .NET 1 la plupart des autres délégués n'existeraient pas.


0 commentaires

2
votes

Cela pourrait également être que lorsque vous écrivez le code de niveau-cadre, vous avez tendance à être plus explicite. Lorsque vous écrivez la boîte à outils et le code de niveau d'application non plus.


0 commentaires

1
votes

Ce qui suit est juste mon adpinion personnelle, mais cela semble raisonnable (ovleusement) raisonnable pour moi; Si nous examinons de près la façon dont vous travaillez en utilisant .NET et V Studio, il apparaît que la notation de type générique semble fuir une "beauté".
xxx

tandis que le code ci-dessus est Pretty simple, droit vers l'avant et bien soutenu par Intelli Sens, l'événement EventHandler "Look and Sensation" ne semble pas si clair. Le support Intelli par défaut suggérera uniquement l'événementHandler, pas son générique. En outre, la notation a juste l'air terrible: xxx




Lors de la vue d'ensemble du code que vous allez lire sur "EventHandler" à chaque fois et votre esprit pourrait connecter ces délégués, Beacuse vous êtes utilisé pour identifier la relation de types par leurs noms.

De l'autre côté, il pourrait également y avoir une explication moins isoterique et plus technique / logique:
Tout d'abord, vous obtenez toujours un objet de l'expéditeur dans la méthode de manutention. Bien que cela semble utile au premier coup d'œil - c'est l'orge jamais utilisé.
De plus, vos arguments doivent tirer des éventuels qui pourraient être ennuyeux ou parfois même immensables en raison de l'utilisation des composants existants.
Autre que les génériques typiques (E.G. IList / List), vous fuyez la possibilité d'utiliser un type plus abstrait (comme une interface) ou simplement un simple type (comme un double).
Enfin, ces règles de notation / suggestions introduites par Microsoft - pour votre exemple de l'événement routé La règle pourrait dire que son type est "marqué" comme étiquette acheminé en ayant le nom de "acheminé". Bien que la nommée pour l'événement indique lui-même que le nom commence par un "prévisualisation".

Comme je l'ai mentionné: c'est juste mon opinion alors ne me blâmez pas;)


1 commentaires

Le paramètre expéditeur a définitivement ses utilisations. Il vient dans lui-même chaque fois que vous avez le même gestionnaire lié aux événements sur plusieurs objets. Bien que ce ne soit pas utile tout le temps, les personnes qui utilisent votre code s'attendent à ce que cela soit disponible. En ce qui concerne l'utilisation de descendants de eventargs , je pense personnellement que la promotion de l'idée de mettre une porte entre votre code et l'utilisateur - en vous assurant de ne jamais donner accidentellement un objet mutable que vous ne les voulez pas. Pour modifier, etc. Vos remarques concernant la dénomination sont définitivement valables, cependant. Me fait souhaiter que c # avait Typedef ...