Domanda

Ricordo di aver letto, in più occasioni e in più posizioni, che quando si lancia l'evento tipico:

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

e dovrebbe essere EventArgs.Empty se non ci sono argomenti interessanti, non null.

Ho seguito la guida nel mio codice, ma mi sono reso conto che non sono chiaro il motivo per cui questa è la tecnica preferita. Perché il contratto indicato preferisce EventArgs.Empty rispetto a null?

È stato utile?

Soluzione

Credo che il ragionamento alla base di NOT NULL sia che quando viene passato come parametro, non è previsto che il metodo debba potenzialmente gestire un'eccezione di riferimento null.

Se passi null, e il metodo prova a fare qualcosa con e otterrà un'eccezione di riferimento null, con EventArgs.Empty non lo farà.

Altri suggerimenti

EventArgs.Empty è un'istanza del Pattern di oggetti null .

Fondamentalmente, avendo un oggetto che rappresenta " nessun valore " per evitare di verificare la presenza di null durante l'utilizzo.

Credo che EventArgs.Empty sia usato per mantenere la convenzione di passare un argomento con un evento, anche se nessuno è necessario.

I venditori di Mitchel hanno pubblicato l'altra metà del mio motivo a metà del mio post: impedisce un'eccezione di riferimento null nel caso in cui un metodo provi a fare qualcosa con quell'argomento (oltre a verificare se è null).

EventArgs.Empty svolge sostanzialmente il lavoro di un argomento Event definito a livello globale senza ulteriori informazioni.

Per dare un esempio simile di mantenimento di una convenzione, il nostro team usa string.Empty per inizializzare una stringa perché altrimenti programmatori diversi potrebbero usare newString = " " ;; o newString = " & Quot ;; o newString = null; , che possono tutti produrre risultati diversi per condizioni di controllo diverse.

Un motivo (leggermente pedante) per usare EventArgs.Empty vs new EventArgs () è che il primo non inizializza un nuovo EventArgs , risparmiando una leggera quantità di memoria.

Se stai usando un metodo generico che ha la firma EventHandler che viene chiamata da qualsiasi gestore di eventi e viene passato sia al mittente dell'oggetto e EventArgs e , può chiamare e.ToString () , ad es. per la registrazione di eventi, senza preoccuparsi di un'eccezione puntatore null.

Ho usato molto tempo " new EventArgs () " invece di " EventArgs.Empty " ... Penso che l'importante sia passare qualcosa che non provochi un'eccezione Null.

dal libro di Albahari: " al fine di evitare un'istanza inutile di un'istanza di EventArgs. "

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top