Pregunta

Esta pregunta ya tiene una respuesta aquí:

Estoy usando el análisis de código Resharper 5.1 muchas veces que recibo un comentario de Resharper como

"Descripción de eventos a través de Anónimo Delegado"

#Part of Code  

if (((bool)e.NewValue))
{
    listView.PreviewTextInput += (o,args) =>
        listView_PreviewTextInput(o,args,listView);
}
else
{
    listView.PreviewTextInput -= (o, args) => 
        listView_PreviewTextInput(o, args, listView);
}

¿Cómo podría corregir u optimizar esta cosa?

¿Fue útil?

Solución

Puede extraer el LAMDBA a una variable:

EventHandler func = (sender, e) =>
    listView_PreviewTextInput(sender, e, listView);

if (((bool)e.NewValue))
{
    listView.PreviewTextInput += func;
}
else
{
    listView.PreviewTextInput -= func;
}

Otros consejos

¡Advertencia!Respuesta aceptada De Steven es equivocado, todo lo que hace es enmascarar un problema del que se advierte Resharper.

Cada vez que se ejecuta el código dado

 EventHandler func = (sender, e) =>
     listView_PreviewTextInput(sender, e, listView);

Obtendrá un nuevo (ya que puede capturar diferente listView) instancia de delegado anónimo guardado en func, una instancia que aún no está suscrita a ningún evento, así que a su vez este código

listView.PreviewTextInput -= func;

No hará nada efectivo, ya que no puede darse de baja de un evento al que no está suscrito. Esto conducirá a errores alucinantes como los manejadores de eventos 'llamados dos veces', filtraciones de memoria, etc.

En realidad, Jon Skeet lo dice puede funcionar en algunos casos:

La especificación C# establece explícitamente (IIRC) que si tiene dos funciones anónimas (métodos anónimos o expresiones lambda) puede o puede que no Crea delegados iguales a partir de ese código.

Por ejemplo, cuando el compilador no genera una nueva instancia cada vez, verá un buen comportamiento.

Pero eso no es confiable y ciertamente no funcionaría en caso de que se describa en una pregunta inicial con variable capturada listView.

Entonces mi sugerencia es:

Use funciones anónimas como manejadores de eventos solo si nunca tendrá que darse de baja.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top