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?

StackOverflow https://stackoverflow.com/questions/141423

  •  02-07-2019
  •  | 
  •  

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 laufen

Ich 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
War es hilfreich?

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:)

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