c# - the - ¿Es una mala práctica escribir controladores de eventos en línea?
publish event c# (3)
¿Es una mala práctica escribir manejadores de eventos en línea?
Para mí, prefiero usarlo cuando quiero usar una variable local en el controlador de eventos como el siguiente:
Prefiero esto:
// This is just a sample
private void Foo()
{
Timer timer = new Timer() { Interval = 1000 };
int counter = 0; // counter has just this mission
timer.Tick += (s, e) => myTextBox.Text = (counter++).ToString();
timer.Start();
}
En lugar de esto:
int counter = 0; // No need for this out of Boo & the event handler
private void Boo()
{
Timer timer = new Timer() { Interval = 1000 };
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
myTextBox.Text = (counter++).ToString();
}
En la mayoría de los casos, preferiría tener los métodos separados, como "timer_Tick ()", sin embargo, preferiría que se llamara OnTimerTick () como:
- Cuando leo la clase, está claro que el trigo está pasando. El "Encendido" me dice que puede manejar el evento.
- Es más fácil establecer un punto de inflexión en el método en el caso "en línea".
- El evento se inició mucho después de que el contratista "Foo" haya regresado, y no creo que esté funcionando dentro del alcance del contratista.
Sin embargo, si el evento solo se activará antes de que el método se declare en línea y el objeto en el que se establece el evento tenga un alcance que esté limitado al método de declaración, entonces creo que la versión "en línea" es mejor. Por lo tanto, me gusta usar "en línea" para que el delegado de comparación pase a un método de "clasificación".
Está absolutamente bien, aunque hay dos advertencias:
- Si está modificando una variable local desde un cierre, debe asegurarse de comprender lo que está haciendo.
- No podrá darse de baja del evento
Por lo general, solo coloco en línea manejadores de eventos realmente simples; para cualquier cosa más involucrada, uso expresiones lambda (o métodos anónimos) para suscribirme con una llamada a un método con un método más apropiado:
// We don''t care about the arguments here; SaveDocument shouldn''t need parameters
saveButton.Click += delegate { SaveDocument(); };
Pones las dos muestras juntas. Está claro que la segunda opción (que no prefieres) es la más legible.
La legibilidad del código y la capacidad de mantenimiento son muy importantes. Mantenga las cosas simples, lo más fácil posible de entender. Las expresiones de Lambda generalmente son consideradas más difíciles de entender por la mayoría de las personas. Incluso si son una segunda naturaleza para ti, para otros podría no serlo.