Frage

Diese Frage hat hier bereits eine Antwort:

Ich verwende die Resharper 5.1 -Codeanalyse oft. Ich bekomme einen Kommentar von Resharper als

"Ereignisunfeinbilde über anonymer Delegierter"

#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);
}

Wie könnte ich dieses Ding korrigieren oder optimieren?

War es hilfreich?

Lösung

Sie können die Lamdba in eine Variable extrahieren:

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

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

Andere Tipps

Warnung!Akzeptierte Antwort von Steven ist falsch, Alles, was es tut, ist nur ein Problem zu maskieren, vor dem Resharper warnt.

Jedes Mal wird der angegebene Code ausgeführt

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

Sie werden frisch bekommen (da Sie möglicherweise andere erfassen listView) Instanz eines anonymen Delegiertens gespeichert auf func, eine Instanz, die noch keine Ereignisse abonniert hat, also wiederum dieser Code

listView.PreviewTextInput -= func;

Wird effektiv nichts tun, da Sie sich nicht von einem Ereignis abmelden können, das Sie nicht abonniert haben. Dies führt zu umwerfenden Fehler wie Ereignishandlern, die zweimal, Memory Lacs usw. angerufen werden.

Eigentlich sagt Jon Skeet es kann in einigen Fällen funktionieren:

In der C# -Pezifikation heißt es ausdrücklich (IIRC), dass wenn Sie zwei anonyme Funktionen (anonyme Methoden oder Lambda -Ausdrücke) haben kann oder kann nicht Erstellen Sie gleiche Delegierte aus diesem Code.

ZB, wenn Compiler nicht jedes Mal eine neue Instanz generiert, werden Sie ein gutes Verhalten sehen.

Das ist jedoch nicht zuverlässig und würde sicherlich nicht funktionieren, wenn in Starter -Frage mit erfasster Variable beschrieben wird listView.

Mein Vorschlag ist also:

Verwenden Sie anonyme Funktionen als Event -Handler nur, wenn Sie sich niemals abmelden müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top