In C#, finde ich mich gelegentlich wollen eine Methode für ein Ereignis in der Mitte einer Versendung von diesem gleichen Ereignis zu registrieren. Wenn ich z. B. eine Klasse habe, die Zustände auf der Grundlage von aufeinanderfolgenden Versendungen desselben Ereignisses umwandelt, möchte ich vielleicht, dass der Handler des ersten Zustands sich selbst abmeldet und den zweiten Handler registriert. Ich möchte jedoch nicht, dass der zweite Handler bis zum nächsten Auslösen des Ereignisses ausgelöst wird.
Die gute Nachricht ist, dass sich die Microsoft-Implementierung von C# anscheinend genau so verhält. Der Syntaxzucker für die Ereignisregistrierung wird durch einen Aufruf von System.Delegate.Combine ersetzt, der einfach die aktuelle Aufrufliste und die neue Methode in einer separaten Liste zusammenfasst und sie der Ereigniseigenschaft zuweist. Dadurch erhalte ich genau das Verhalten, das ich möchte.
Meine Frage ist also: Ist dieses Verhalten durch den Sprachstandard garantiert? Ich möchte in der Lage sein, meine C#-Code auf anderen Plattformen unter Mono laufen und in der Regel wollen sicherstellen, dass ich nicht machen Annahmen über den Sprachstandard auf der Grundlage seiner Implementierung.
Ich konnte auf MSDN keine definitiven Informationen finden.
Wenn Sie ein konkretes Beispiel dafür haben möchten, wovon ich spreche, hier ist 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 lautet die Ausgabe:
First
First
Second