73 votes

Pourquoi utiliser EventArgs.Vide au lieu de null?

Je me souviens avoir lu, à plusieurs reprises et en plusieurs endroits, que lors du déclenchement de l'événement typique:

protected virtual OnSomethingHappened()
{
    this.SomethingHappened(this, EventArgs.Empty);
}

e doit être EventArgs.Vide si il n'y a aucun évènement intéressant args, pas null.

J'ai suivi les conseils de mon code, mais j'ai réalisé que je ne suis pas clair sur pourquoi c'est la technique de choix.

  1. Pourquoi ne le dit contrat préférez EventArgs.Vide null?
  2. Ce genre de situations dans ma propre code pour justifier une conception similaire décision? Quand devrais-je envisager de la création statique "Rien intéressant ici" de la propriété au lieu de utiliser la valeur null pour indiquer l'absence de quelque chose d'intéressant?
  3. A l'ajout de nullable types de valeur touché ces décisions?

37voto

Mitchel Sellers Points 38352

Je crois que le raisonnement derrière la NON NULL est que lorsqu'il est passé en tant que paramètre, il n'est pas prévu pour la méthode à la nécessité de traiter potentiellement une référence nulle exception.

Si vous passer la valeur null, et la méthode essaie de faire quelque chose avec e il obtiendra une référence nulle exception, avec EventArgs.Vide, il ne sera pas.

28voto

Martin Konicek Points 7999

EventArgs.Empty est une instance de l' objet Nul motif.

En gros, avoir un objet qui représente "pas de valeur" pour éviter de vérifier null lors de l'utilisation.

8voto

ForCripeSake Points 265

Je crois EventArgs.Vide est utilisé pour maintenir la convention de passage d'un argument à un événement, même si cela n'est pas nécessaire.

Mitchel Vendeurs posté l'autre moitié de ma raison à mi-chemin par le biais de mon post: il empêche une référence nulle exception d'une méthode d'essayer de faire quelque chose avec cet argument (en plus de vérifier si elle est nulle).

EventArgs.Vide fait le travail d'un globalement défini Argument d'Événement avec pas de renseignements supplémentaires.

MODIFIER

Pour donner un exemple similaire de maintien de la convention - notre équipe utilise string.empty d'initialiser une chaîne de caractères b/c sinon les différents codeurs peuvent utiliser newString = ""; or newString = " "; or newString = null;

Qui peut produire des résultats différents vérifier les conditions.

EDIT #2

Un (un peu pédant) en raison de l'utilisation d'EventArgs.Vide Vs new EventArgs() est que le premier n'a pas initialiser une nouvelle EventArgs, enregistrant une légère quantité de mémoire.

2voto

Mark Cidade Points 53945

Si vous utilisez une méthode générale qui a l' EventHandler signature qui est appelée à partir d'un gestionnaire d'événement est transmis à la fois l' object sender et EventArgs e, il peut appeler e.ToString(), par exemple, pour l'enregistrement des événements, sans se soucier d'une exception de pointeur null.

0voto

Patrick Desjardins Points 51478

J'ai utilisé longtemps la "nouvelle EventArgs()" au lieu de "EventArgs.Vide"... je pense que l'important est de faire passer quelque chose qui va pas provoquer une exception Nulle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X