Wenn ich für ein Ereignis in c # zu registrieren, während es Versand, bin ich garantiert nicht wieder während dieser Versendung genannt werden?
Frage
In C #, finde ich mich gelegentlich ein Verfahren für eine Veranstaltung in der Mitte einer Versendung der selbe Veranstaltung anmelden will. Zum Beispiel, wenn ich eine Klasse, die Staaten auf Basis von aufeinanderfolgenden Sendungen des gleichen Ereignisses übergeht, könnte ich den ersten Zustand Handler selbst deregistrieren will und den zweiten Handler zu registrieren. Allerdings habe ich nicht die zweiten Handler will bis zum nächsten Mal versandt werden das Ereignis ausgelöst wird.
Die gute Nachricht ist, dass es aussieht wie die Microsoft-Implementierung von C # genau auf diese Weise verhält. Der Event-Registrierung Syntax Zucker wird mit einem Aufruf an System.Delegate.Combine ersetzt, die nur verkettet die aktuelle Aufrufliste und die neue Methode in eine separate Liste und ordnen diese die Ereigniseigenschaft. Das gibt mir genau das Verhalten, das ich will.
Also, meine Frage ist: ist dies garantiert Verhalten des Sprachstandard? Ich mag meine C # -Code auf anderen Plattformen unter Mono und in der Regel will sicherstellen, dass ich nicht machen Annahmen über den Sprachstandard auf der Grundlage ihrer Umsetzung.
in die Lage sein zu laufenIch konnte keine definitiven Informationen über MSDN finden.
Wenn Sie ein konkretes Beispiel für mögen, was ich rede, hier ein Beispiel:
delegate void TestDelegate();
static event TestDelegate TestEvent;
static void Main (string[] args) {
TestEvent += TestDelegateInstanceFirst;
TestEvent();
TestEvent();
}
static void TestDelegateInstanceFirst () {
Console.WriteLine("First");
TestEvent += TestDelegateInstanceSecond;
}
static void TestDelegateInstanceSecond () {
Console.WriteLine("Second");
}
zumindest unter Windows, der Ausgang ist:
First
First
Second
Lösung
Ja, es ist garantiert.
Von der einheitlichen C # 3.0-Spezifikation, Abschnitt 15.1:
Wenn jedoch zwei Nicht-Null-Delegierten Instanzen kombiniert werden, ihre Aufruflisten verkettet-in die Reihenfolge von links Operanden dann rechts Operanden, um eine neue Aufrufliste zu bilden, , die zwei oder mehr Einträge.
Beachten Sie die „neue Aufrufliste“. Und wieder in Abschnitt 15.3:
Sobald instanziiert, delegieren Instanzen beziehen sich immer auf das gleiche Zielobjekt und Methode. Denken Sie daran, wenn zwei Teilnehmer werden vereinigt, oder eine ist von dem anderen entfernt, ein neuer Delegierter führt mit seiner eigenen Aufrufliste; die Aufruflisten der Delegierten kombiniert oder entfernt wurden, bleiben unverändert.
Schließlich MSDN für System.Delegate heißt es:
Die Delegierten sind unveränderlich; einmal erstellt, die Aufrufliste eines Delegierten tut ändern sich nicht.
Ich vermute, es ist etwas in der CLI-Spezifikation - Ich werde überprüfen, ob Sie möchten, aber hoffentlich haben diese drei Sie genug Vertrauen gegeben:)