Ereignisunfeinsabschreibung über anonymer Delegierter [Duplikat
-
26-10-2019 - |
Frage
Diese Frage hat hier bereits eine Antwort:
- Abbestellen der anonymen Methode in C# abbestellen 11 Antworten
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?
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.