2015-05-24 14 views
6

questa è una domanda più teorica. So che ogni evento in C# deve avere 2 parametri: oggetto ed eventargs. È chiaro. Ma perché la classe eventargs di base esiste anche quando è impossibile passare qualsiasi dato con esso? Naturalmente posso creare una nuova classe EventArgs che erediti da quella di base, ma mi manca il punto della classe che non può contenere alcun dato.Perché esiste una classe EventArgs di base

+1

Un evento non * deve * avere questi due parametri, solo un evento che viene gestito utilizzando un delegato che eredita da "EventHandler". – Rotem

+1

@Rotem: chiudi, ma i delegati non ereditano. –

+0

Il modello è una libreria/linea guida del framework. –

risposta

7

Si tratta di rendere il codice a prova di futuro.

Secondo la teoria, se a un certo punto si scopre che il codice dovrebbe pubblicare più dati per i gestori di eventi rispetto a prima, è possibile aggiungere semplicemente più proprietà all'oggetto che si passa a tali gestori di eventi.

Se, per qualche motivo, la classe che detiene tali dati non è sotto il tuo controllo ne erediti e aggiungi le proprietà alla classe ereditata. Fin qui tutto bene.

Tuttavia, se non è mai passato alcun oggetto al gestore eventi in primo luogo, non è possibile aggiungere un nuovo parametro all'evento delegato senza interruzione di codice esistente.

Come tale, che si passa a un oggetto fittizio, EventArgs.Empty agli eventi ora si ha la possibilità di ereditare successivamente da EventArgs e iniziare a passare i dati agli stessi eventi, senza dover cambiare affatto i gestori di eventi. Nella maggior parte dei casi, non è nemmeno necessario ricompilare gli assembly che utilizzano il gestore eventi.

Così EventArgs è solo una classe a portata di mano che si passa ai gestori di eventi, si potrebbe facilmente creare il proprio, ma dal momento che non ha alcun significato se non per essere un segnaposto per possibili cambiamenti futuri, non c'è bisogno di creare il proprio, utilizzare semplicemente EventArgs.

+0

Ok, ho capito, ma continuo a pensare che sia un peccato che non abbia alcuna proprietà dell'oggetto o qualcosa del genere. O c'è una classe così preparata? – czubehead

+0

EventArgs non ha senso: lo stesso risultato avrebbe potuto essere ottenuto passando un argomento di tipo System.Object. EventArgs.Empty poteva anche essere un fittizio System.Object invece di un fittizio System.EventArgs. –