2010-10-31 10 views
51

¿Es una mala práctica escribir manejadores de eventos en línea?¿Es una mala práctica escribir manipuladores de eventos en línea

Para mí, prefiero usarlo cuando quiera utilizar una variable local en el controlador de eventos como el siguiente:

Yo prefiero esta:

// 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(); 
} 

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(); 
} 
+0

Sí, las lambdas y los cierres están seguros eeevil ... – delnan

+5

Creo que depende de tu equipo. Si todo el mundo está al tanto de esas características, está bien. Personalmente me gusta hacer que las lambdas sean más obvias en una línea separada, etc., me gusta codificar para que 1 línea de código haga 1 cosa. – kenny

+0

+1 @kenny Estoy de acuerdo contigo, esto hace que el código sea más legible. –

Respuesta

63

Está absolutamente bien, aunque hay dos advertencias:

  • Si está modificando una variable local desde un cierre, debe asegurarse de comprender lo que está haciendo.
  • Usted no será capaz de dejar de recibir el evento

Normalmente yo sólo en línea realmente controladores de eventos simples - para nada más involucrados, utilizo expresiones lambda (o métodos anónimos) a suscribir 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(); }; 
+1

Esta es una gran respuesta, gracias hombre :) – bebosh

+0

Esta respuesta puede enviar personas por un mal camino. Depende de la aplicación en cuanto a la importancia de que el controlador de eventos no pueda darse de baja. En situaciones con limitaciones de memoria (por ejemplo, en dispositivos móviles), es importante limpiar los controladores de eventos para asegurarse de que los ViewControllers y las Actividades se puedan recoger correctamente.De lo contrario, puede aumentar notablemente la asignación de memoria o comportamientos involuntarios cuando se activa un evento para una pantalla que se encuentra en la pila de navegación y que no se muestra actualmente. Es importante saber, en función de su caso de uso, si está bien que los eventos no se anulen. – SmartyP

+0

@SmartyP: los usuarios deben saber si necesitan cancelar la suscripción a eventos, y eso no está realmente en el alcance de esta pregunta, IMO. He dejado en claro que no pueden hacerlo, lo que significa que si lo necesitan, sabrán que no deben usar funciones anónimas. –

0

Junte las dos muestras. Está claro que la segunda opción (que no prefieres) es la más legible.

La legibilidad del código y el 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.

+1

Personalmente, encuentro que la sintaxis Lambda es más rápida de analizar mentalmente y prefiere la primera muestra. Pero luego esto es 4 años después. – Holf

3

En la mayoría de los casos yo preferiría tener los métodos separadas como “timer_Tick()”, sin embargo, debería más bien ser llamado OnTimerTick() como:

  • Cuando leí la clase, que es el trigo más clara es 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 sólo será despedido antes de que el método se declara retornos en línea y el objeto del evento se establece en tiene un alcance lo que se limita al método de declarar, a continuación, creo que el “en línea "versión 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".

Cuestiones relacionadas