2008-10-09 21 views
57

Recuerdo haber leído, en múltiples ocasiones y en varias ubicaciones, que cuando se dispare el evento típico:¿Por qué utilizar EventArgs.Empty en lugar de null?

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

electrónico debe ser EventArgs.Empty si no hay argumentos de eventos interesantes, no nulos.

He seguido las instrucciones en mi código, pero me di cuenta de que no tengo claro por qué esa es la técnica preferida.

  1. ¿Por qué el contrato establecido prefiere EventArgs.Empty over null?
  2. ¿Qué tipo de situaciones en mi propio código justificaría un diseño similar decisión? ¿Cuándo debería considerar crear alguna propiedad estática "Nothing interesting here" en lugar de usando null para indicar la ausencia de algo interesante?
  3. ¿La adición de tipos de valores con valores nulos ha impactado estas decisiones?
+0

¡Excelente pregunta! –

+0

Gracias. :) Me acabo de dar cuenta de que he estado haciendo programación de culto a cargo de esta manera particular durante años, ahora quiero saber por qué. :) –

Respuesta

28

Creo que el razonamiento detrás de NOT NULL es que cuando se pasa como un parámetro, no se espera que el método necesite manejar una excepción de referencia nula.

Si pasa null, y el método intenta hacer algo con e, obtendrá una excepción de referencia nula, con EventArgs.Empty no lo hará.

+0

¿En qué situaciones usarías una técnica similar en tu propio código? –

+6

Si un método puede pasar información del evento y otro no. Todavía puedo llamar a e.ToString() independientemente, pero uno puede pasar un tipo personalizado y el otro pasa EventArgs.Empty –

+3

Greg, el punto aquí es que el controlador de eventos es * no * tu código. Primero quieres seguridad porque estás definiendo y planteando el evento, y alguien más escribirá el controlador de eventos. –

2

Si está utilizando un método de propósito general que tiene la firma EventHandler que se llama desde cualquier controlador de eventos y se transmite tanto la object sender y EventArgs e, puede llamar e.ToString(), por ejemplo, para eventos de registro, sin Preocuparse por una excepción de puntero nulo.

5

Creo que EventArgs.Empty se utiliza para mantener la convención de pasar un argumento con un evento, incluso si no es necesario.

Mitchel Sellers publicó la otra mitad de mi razón a mitad de mi publicación: evita una excepción de referencia nula si un método intenta y hace algo con ese argumento (además de comprobar si es nulo).

EventArgs.Empty básicamente hace el trabajo de un Argumento de Evento definido globalmente sin información adicional.

EDITAR

Para dar un ejemplo similar de mantener un convencionalmente nuestro equipo utiliza string.empty para inicializar una cadena b/c de lo contrario diferentes codificadores pueden utilizar newString = ""; or newString = " "; or newString = null;

Todo lo cual puede producir resultados diferentes para diferentes cheque condiciones

editar # 2

Una razón (un poco pedante) para utilizar EventArgs.Empty Vs nuevos EventArgs() es que el primero no inicializa una nueva EventArgs, ahorrando una pequeña cantidad de memoria.

+2

La "pequeña cantidad de memoria" puede ser significativa para un evento que se plantea muchas veces, como un evento MouseMove. –

0

Usé mucho tiempo "new EventArgs()" en lugar de "EventArgs.Empty" ... Creo que lo importante es pasar algo que no cause una excepción nula.

+5

EventArgs.Empty no es nulo, es una variable estática inicializada con "new EventArgs()". Significa que no terminas desperdiciando recursos inicializando lo que es efectivamente un objeto marcador de posición sin valor variable. – ICR

+3

Si no hay datos significativos en EventArgs, no cree una instancia. EventArgs.Empty hará el trabajo sin la sobrecarga de crear un objeto inútil que solo será basura. –

+0

Estoy de acuerdo. El uso de nuevos EventArgs() hace que el intento sea menos claro para el próximo programador que se presente, y es un poco derrochador. –

24

es una instancia del Null object pattern.

Básicamente, tiene un objeto que representa "sin valor" para evitar la comprobación de nulo al usarlo.

+0

+1 para vincular al patrón de diseño –

0

de Albahari libro: "in order to avoid unnecessarily instantiating an instance of EventArgs."

+3

'null' no instancia una instancia de' EventArgs'. –

Cuestiones relacionadas