Pregunta

Recuerdo haber leído, en múltiples ocasiones y en múltiples ubicaciones, que al disparar el evento típico:

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

e debería ser EventArgs.Empty si no hay argumentos de evento interesantes, no nulos.

He seguido la guía en mi código, pero me di cuenta de que no tengo claro por qué esa es la técnica preferida. ¿Por qué el contrato declarado prefiere EventArgs.Empty sobre nulo?

¿Fue útil?

Solución

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

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

Otros consejos

EventArgs.Empty es una instancia del Patrón de objeto nulo .

Básicamente, tener un objeto que representa " ningún valor " para evitar comprobar si hay valores nulos al usarlo.

Creo que EventArgs.Empty se usa para mantener la convención de pasar un argumento con un evento, incluso si no se necesita ninguno.

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

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

Para dar un ejemplo similar de mantenimiento de una convención, nuestro equipo usa string.Empty para inicializar una cadena porque, de lo contrario, diferentes codificadores podrían usar newString = " " ;; o newString = " " ;; o newString = null; , todo lo cual puede producir resultados diferentes para diferentes condiciones de verificación.

Una razón (ligeramente pedante) para usar EventArgs.Empty vs new EventArgs () es que el primero no inicializa un nuevo EventArgs , ahorrando una pequeña cantidad de memoria.

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 pasa tanto al emisor de objetos y EventArgs e , puede llamar a e.ToString () , por ejemplo, para registrar eventos, sin preocuparse por una excepción de puntero nulo.

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

del libro de Albahari: " para evitar crear instancias innecesarias de una instancia de EventArgs. "

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top