Pergunta

Lembro-me de ler, em várias ocasiões e em vários locais, que quando disparar o evento típico:

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

e deve ser EventArgs.Empty se não houver argumentos de eventos interessantes, não nulo.

Eu segui a orientação no meu código, mas eu percebi que eu não estou claro sobre por que isso é a técnica preferida. Por que o contrato declarado preferir EventArgs.Empty sobre nulo?

Foi útil?

Solução

Eu acredito que o raciocínio por trás do NOT NULL é que quando passado como um parâmetro, não é esperado para que o método necessidade de potencialmente lidar com uma exceção de referência nula.

Se você passar nulo, e as tentativas de método para fazer algo com e ele vai ter uma exceção de referência nula, com EventArgs.Empty ele não vai.

Outras dicas

EventArgs.Empty é uma instância da Null objeto padrão .

Basicamente, ter um objeto que representa "nenhum valor" para evitar a verificação de nulo quando usá-lo.

Eu acredito EventArgs.Empty é usado para manter a convenção de passar uma discussão com um evento, mesmo se são necessários nenhum.

Mitchel Sellers postou a outra metade da minha razão na metade da minha mensagem: ele impede que uma exceção de referência nula deve um método tentar fazer algo com esse argumento (além de verificar se é null)

.

EventArgs.Empty basicamente faz o trabalho de um argumento de evento definidos globalmente com nenhuma informação adicional.

Para dar um exemplo semelhante de manter uma convenção, nossos usos da equipe string.Empty para inicializar uma string porque senão diferentes programadores podem usar newString = ""; or newString = " "; or newString = null;, todos os quais podem produzir resultados diferentes para diferentes condições de seleção.

A (ligeiramente pedante) razão para usar EventArgs.Empty vs new EventArgs() é que o primeiro não inicializar uma nova EventArgs, poupando uma pequena quantidade de memória.

Se você estiver usando um método de uso geral que tem a assinatura EventHandler que é chamado de qualquer manipulador de eventos e é transmitida tanto o object sender e EventArgs e , ele pode chamar e.ToString(), por exemplo, para o registro de eventos, sem se preocupar com a exceção de ponteiro nulo.

Eu usei muito tempo "novos EventArgs ()" em vez de "EventArgs.Empty" ... Eu acho que o importante é passar algo que não irá causar uma exceção nulo.

a partir Albahari livro: "in order to avoid unnecessarily instantiating an instance of EventArgs."

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top