2012-11-25 3 views
7

Zum Beispiel:Wie funktioniert der Operator + zum Kombinieren von Delegaten?

delegate void SomeDelegate(); 

SomeDelegate a = new SomeDelegate(() => Console.WriteLine("A")); 
SomeDelegate b = new SomeDelegate(() => Console.WriteLine("B")); 

SomeDelegate c = a + b; 

In der letzten Zeile, was bedeutet a + b übersetzen? Ich bin nur neugierig, wie ich sie ohne den Operator + hinzufügen würde.

+0

Ich wusste nicht, dass diese gültig C# -Code ist. – rekire

+0

@rekire: Nun, die erste Zeile wäre außerhalb einer Funktion und die nächsten 3 wären in einer. –

Antwort

5

http://msdn.microsoft.com/en-us/library/ms173172(v=VS.80).aspx - Suche nach Zusatz:

Ein Delegierter kann mehr als eine Methode aufrufen, wenn sie aufgerufen wird. Dies ist , das als Multicasting bezeichnet wird. Um der Methodenliste des Delegaten eine zusätzliche Methode hinzuzufügen - die Aufrufliste - müssen lediglich zwei Delegierte mit Hilfe der Additions- oder Additionszuweisungsoperatoren ('+' oder '+ =') hinzugefügt werden. Zum Beispiel:

MethodClass obj = new MethodClass(); 
Del d1 = obj.Method1; 
Del d2 = obj.Method2; 
Del d3 = DelegateMethod; 

//Both types of assignment are valid. 
Del allMethodsDelegate = d1 + d2; 
allMethodsDelegate += d3; 

An diesem Punkt allMethodsDelegate enthält drei Methoden in ihrer Aufrufliste-Method1, Method2 und DelegateMethod. Die ursprünglichen drei Delegaten, d1, d2 und d3, bleiben unverändert. Wenn allMethodsDelegate aufgerufen wird, werden alle drei Methoden der Reihe nach aufgerufen. Wenn der Delegat Referenzparameter verwendet, wird die Referenz nacheinander an jede der drei Methoden übergeben, und alle Änderungen nach einer Methode sind für die nächste Methode sichtbar. Wenn eine der Methoden eine Ausnahme auslöst, die nicht innerhalb der Methode abgefangen wird, wird die Ausnahme an den Aufrufer des Delegaten übergeben und keine nachfolgenden Methoden in der Aufrufliste aufgerufen.

aktualisieren

Beide Teilnehmer stammen aus System.Delegate Sie die combine() Methoden verwenden können zusammen zwei Teilnehmer hinzuzufügen.

+0

Ja, ich weiß Zusatz funktioniert. Ich frage, wie die Addition funktioniert. Wie würden Sie zum Beispiel das gleiche Verhalten simulieren, ohne den Operator + zu verwenden? Gibt es eine Funktion zu verwenden? –

+0

Ah, ich sehe, aktualisiert. – Prescott

+0

Müssen Sie es so werfen: 'SomeDelegate c = (SomeDelegate) Delegate.Combine (a, b);'? Tut der + Operator das auch intern? –

3

Es ist mit Delegate.Combine statische Methode gemacht.

SomeDelegate c = Delegate.Combine(a, b) as SomeDelegate; 

Bei der Verwendung += Operator ist es eigentlich genau das gleiche.

// This is the same... 
eventSource.onEvent += OnEvent; 

// ...as this. 
eventSource.onEvent = Delegate.Combine(
    eventSource.onEvent, 
    Delegate.CreateDelegate(typeof(EventSource.OnEvent), this, "OnEvent") 
    ) as EventSource.OnEvent; 

MulticastDelegate Klasse (die Klasse hinter delegate Schlüsselwort) tun, um eine Liste von Anrufungen, aber diese Liste ist unveränderlich. Jedes Mal, wenn die Delegierten mit dem += Operator verbinden, wird eine neue Instanz MulticastDelegate erhalten erstellt die Aufrufliste der ehemaligen zwei Delegierten Objekte kombiniert.

Verwandte Themen