the fire event delegate and c# design events

fire - event sample c#



¿Por qué usar EventArgs.Empty en lugar de null? (6)

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 mitad de mi publicación: evita 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.

EDITAR

Para dar un ejemplo similar de mantener una convención, nuestro equipo usa string.empty para inicializar una cadena b / c; de lo contrario, diferentes codificadores podrían usar newString = ""; or newString = " "; or newString = null; newString = ""; or newString = " "; or newString = null;

Todo lo cual puede producir diferentes resultados para diferentes condiciones de verificación.

EDIT # 2

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

Recuerdo haber leído, en múltiples ocasiones y en múltiples lugares, que cuando disparaba el evento típico:

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

e debe ser EventArgs.Empty si no hay eventos interesantes args, no null.

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.

  1. ¿Por qué el contrato establecido prefiere EventArgs.Empty sobre null?
  2. ¿Qué tipo de situaciones en mi propio código justificarían una decisión de diseño similar? ¿Cuándo debería considerar crear alguna propiedad estática "Nada interesante aquí" en lugar de usar null para indicar la ausencia de algo interesante?
  3. ¿La adición de tipos de valores que se puede anotar ha impactado estas decisiones?

Creo que el razonamiento detrás de NOT NULL es que cuando se pasa como parámetro, no se espera que el método necesite manejar 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á.


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 el object sender del object sender como EventArgs e , puede llamar a e.ToString() , por ejemplo, para registrar eventos, sin preocuparse por una excepción de puntero nulo.


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


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


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

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