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. Pourquoi ne le dit contrat préfèrent EventArgs.Vide null?
Vous devez vous connecter pour publier un commentaire.
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.
EventArgs.Empty
est une instance de la Objet Null modèle.Fondamentalement, ayant un objet représentant "pas de valeur" pour éviter de vérifier la valeur null lorsque vous l'utilisez.
Je crois
EventArgs.Empty
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.Empty
fait le travail d'un globalement défini Argument d'Événement avec pas de renseignements supplémentaires.Pour donner un exemple similaire de maintien de la convention, notre équipe utilise
string.Empty
pour initialiser une chaîne de caractères parce que sinon, les différents codeurs peuvent utilisernewString = ""; or newString = " "; or newString = null;
, qui peut produire des résultats différents vérifier les conditions.Un (un peu pédant) raison de l'utilisation d'
EventArgs.Empty
vsnew EventArgs()
est que le premier n'a pas initialiser une nouvelleEventArgs
, enregistrant une légère quantité de mémoire.Si vous êtes en utilisant une méthode générale qui a le
EventHandler
signature qui est appelée à partir d'un gestionnaire d'événement est transmis à la fois laobject sender
etEventArgs e
, il peut appelere.ToString()
, par exemple, pour l'enregistrement des événements, sans se soucier d'une exception de pointeur null.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.
de Albahari livre:
"in order to avoid unnecessarily instantiating an instance of EventArgs."
null
ne pas instancier une instance deEventArgs
.