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
risposta
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
.
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
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. –
- 1. Razionale dietro la classe EventArgs
- 2. Perché CompositionTarget.Rendering accetta EventArgs invece di RenderingEventArgs?
- 3. Perché una classe modello derivata non ha accesso agli identificatori di una classe modello di base?
- 4. Perché non esiste una classe di caratteri `Cofunctor` in Haskell?
- 5. unique_ptr a una classe base
- 6. RoutedEventArgs vs EventArgs
- 7. Esiste un'associazione speciale tra la classe EventArgs e la parola chiave evento?
- 8. C#: come si ottiene una classe base di classe?
- 9. Effetti di una classe base const
- 10. intrusive_ptr: Perché non è fornita una classe base comune?
- 11. È possibile passare dati a EventArgs senza creare una classe derivata?
- 12. chiamata una classe base metodo
- 13. C#: Come testare una classe di lavoro threaded di base
- 14. Python - Test di una classe base astratta
- 15. Perché viene visualizzato l'errore "A <int>" non è una base accessibile di "S <int>" per la classe base di una classe base?
- 16. Perché la classe di classe Data.String.IsString definisce solo una conversione?
- 17. Controllo esiste un membro, eventualmente in una classe di base, C++ 11 versione
- 18. Come ottenere un'istanza di classe base da una classe derivata
- 19. MVVM - Esiste una classe di base del modello di visualizzazione open source?
- 20. Classe di base inaccessibile
- 21. Esiste una classe IndexSet e una classe Range per Java?
- 22. Posso fare l'alias di un membro di una classe base in una classe derivata?
- 23. Creare un oggetto classe base da una classe derivata
- 24. Classe base vs Classe di utilità
- 25. Esiste una funzione standard per iterare sulle classi base?
- 26. Estensione di un delegato da una classe base
- 27. Chiamare una funzione sottoposta a override da una classe base?
- 28. Perché non esiste una classe di albero <T> in .NET?
- 29. Come trasmettere un vettore di shared_ptrs di una classe derivata a un vettore di share_ptrs di una classe base
- 30. Classe base o classe astratta?
Un evento non * deve * avere questi due parametri, solo un evento che viene gestito utilizzando un delegato che eredita da "EventHandler". – Rotem
@Rotem: chiudi, ma i delegati non ereditano. –
Il modello è una libreria/linea guida del framework. –