Bei Verwendung von myDelegate -= eventHandler
ReSharper (Version 6) treten folgende Probleme auf:
Die Delegatensubtraktion hat ein unvorhersehbares Ergebnis
Das Rationale dahinter wird hier von JetBrains erklärt . Die Erklärung ist sinnvoll und nachdem ich sie gelesen habe, bezweifle ich, dass ich sie -
für Delegierte verwende.
Wie dann ,
- Kann ich ein nicht automatisches Ereignis schreiben, ohne ReSharper mürrisch zu machen?
- oder gibt es einen besseren und / oder "richtigen" Weg, dies umzusetzen?
- oder kann ich ReSharper einfach ignorieren?
Hier ist vereinfachter Code:
public delegate void MyHandler (object sender);
MyHandler _myEvent;
public event MyHandler MyEvent
{
add
{
_myEvent += value;
DoSomethingElse();
}
remove
{
_myEvent -= value; // <-- ReSharper warning here
}
}
Antworten:
Hab keine Angst! Der erste Teil der Warnung von ReSharper gilt nur für das Entfernen von Delegiertenlisten. In Ihrem Code entfernen Sie immer einen einzelnen Delegaten. Der zweite Teil befasst sich mit der Bestellung von Delegierten, nachdem ein doppelter Delegierter entfernt wurde. Ein Ereignis garantiert seinen Abonnenten keine Ausführungsreihenfolge, sodass Sie auch nicht wirklich betroffen sind.
ReSharper gibt diese Warnung aus, da die Subtraktion von Multicast-Delegaten Fallstricke haben kann. Diese Sprachfunktion wird nicht vollständig verurteilt. Glücklicherweise befinden sich diese Fallstricke in Randfällen, und es ist unwahrscheinlich, dass Sie ihnen begegnen, wenn Sie nur einfache Ereignisse instrumentieren. Es gibt keinen besseren Weg, um Ihre eigenen
add
/remove
Handler zu implementieren. Sie müssen nur darauf achten.Ich würde vorschlagen, die Warnstufe von ReSharper für diese Nachricht auf "Hinweis" herunterzustufen, damit Sie nicht für die Warnungen desensibilisiert werden, die normalerweise nützlich sind.
quelle
Delegate
nicht nicht überlasten+
und-
.)PIT OF SUCCESS IS THAT WAY --->
.Delegate.Combine
die Multicast-Delegaten "abflacht". Wenn also die Delegierten [X, Y] und Z angegeben werden, kann nicht angegeben werden, ob das Ergebnis [X, Y, Z] oder [[ X, Y], Z] (der letztere Delegierte hält den[X,Y]
Delegierten als seinenTarget
und dieInvoke
Methode dieses Delegierten als seinenMethod
).Sie sollten Delegaten nicht direkt zum Summieren oder Subtrahieren verwenden. Stattdessen dein Feld
Sollte stattdessen auch als Ereignis deklariert werden. Dies löst das Problem, ohne Ihre Lösung zu gefährden, und bietet dennoch den Vorteil der Verwendung von Ereignissen.
Die Verwendung der Delegatensumme oder -subtraktion ist gefährlich, da Sie beim einfachen Zuweisen des Delegaten Ereignisse verlieren können (gemäß der Deklaration wird der Entwickler nicht direkt darauf schließen, dass es sich um einen Multicast-Delegaten handelt, wie wenn er als Ereignis deklariert wird). Um nur zu veranschaulichen, wenn die in dieser Frage erwähnte Eigenschaft nicht als Ereignis gekennzeichnet wurde, werden im Code unten die beiden ersten Zuweisungen als VERLOREN eingestuft, da jemand einfach dem Delegaten zugewiesen wurde (was ebenfalls gültig ist!).
Bei der Zuweisung von Methode 3 habe ich die beiden Erstabonnements vollständig verloren. Durch die Verwendung von Ereignissen wird dieses Problem vermieden und gleichzeitig die ReSharper-Warnung entfernt.
quelle
Setzen Sie es auf = null, anstatt - = zu verwenden
quelle
remove
Methode eines Ereignisses sollte nicht alle Handler entfernen, sondern den Handler, dessen Entfernung angefordert wurde.