c# - lista - ¿Por qué los eventos suelen utilizar EventHandler, incluso cuando no es necesario pasar ningún argumento?
eventos vb net (3)
Es una práctica común en C # al crear un evento, definirlo de la siguiente manera, tomado de un ejemplo en las Directrices de .NET Framework :
public class CustomEventArgs : EventArgs
{
public CustomEventArgs(string s)
{
msg = s;
}
private string msg;
public string Message
{
get { return msg; }
}
}
...
public delegate void CustomEventHandler(object sender, CustomEventArgs a);
A menudo, creo eventos que no necesitan ningún argumento en absoluto. Usualmente implemento esto simplemente usando Action
para el tipo de controlador de eventos.
public event Action LogonScreenExited;
Me preguntaba si hay alguna razón por la que uno quisiera seguir el patrón "tradicional". ¿Acaso eventos como este indican una falla de diseño? Sin embargo, mi razonamiento para usar Action
es YAGNI , ¿por qué implementar algo (e incluso mostrar intención) cuando no se usa?
No debe confiar en clases a las que no tiene acceso para modificar sus códigos. El paso de un evento extra que se crea a partir de su propia clase derivada de EventArgs le permitirá pasar argumentos adicionales en el futuro.
También su código admitirá la clase EventHandler<T>
que su T debería derivar de la clase EventArgs.
No es un requisito, simplemente una guía de diseño.
Deberá tener en cuenta que no puede predecir cómo el código del cliente usará el evento y no puede predecir el futuro. El argumento del remitente es útil para el programador cliente, ya que le permite usar un solo método de control de eventos que maneja eventos de múltiples fuentes de eventos. Derivar de EventArgs es útil ya que le permite refactorizar el evento, derivar de la clase base original y agregar argumentos adicionales, sin romper el código del cliente. Usted es libre de ignorar los beneficios de este enfoque.
Porque puede escribir un controlador de eventos genérico y usarlo para muchos tipos diferentes de eventos (como una instalación de registro) aprovechando la contravariance de los delegados.
Aquí hay un ejemplo de la msdn:
// Event hander that accepts a parameter of the EventArgs type.
private void MultiHandler(object sender, System.EventArgs e)
{
label1.Text = System.DateTime.Now.ToString();
}
public Form1()
{
InitializeComponent();
// You can use a method that has an EventArgs parameter,
// although the event expects the KeyEventArgs parameter.
this.button1.KeyDown += this.MultiHandler;
// You can use the same method
// for an event that expects the MouseEventArgs parameter.
this.button1.MouseClick += this.MultiHandler;
}
Aparte de esto, es solo una guía de diseño, una forma recomendada . A continuación, su código se puede mantener y es consistente con el resto de .NET, lo que ayuda mucho a quienes usarán sus clases.