2012-11-25 4 views
7

Na przykład:Jak działa operator + do łączenia delegatów?

delegate void SomeDelegate(); 

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

SomeDelegate c = a + b; 

w ostatnim wierszu, co nie przekłada się a + b? Ciekawi mnie tylko, jak mógłbym je dodać bez korzystania z operatora +.

+0

Nie wiedziałem, że jest to poprawny kod C#. – rekire

+0

@rekire: Cóż, pierwsza linia byłaby poza funkcją, a następne 3 byłyby w jednym. –

Odpowiedz

5

http://msdn.microsoft.com/en-us/library/ms173172(v=VS.80).aspx - Znajdź Ponadto:

Delegat może wywołać więcej niż jedną metodę przy wywołaniu. Jest to określane jako multiemisja. Aby dodać dodatkową metodę do listy metod dla delegatów: - lista wywołań - wystarczy dodać dwóch delegatów za pomocą operatorów dodawania lub dodawania przydziałów ("+" lub "+ ="). Na przykład:

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; 

W tym momencie allMethodsDelegate zawiera trzy metody w swojej wywołaniu list-Method1, Method2 i DelegateMethod. Oryginalni trzech delegatów, d1, d2 i d3, pozostają niezmienione. Po wywołaniu metody allMethodsDelegate wszystkie trzy metody są wywoływane w kolejności. Jeśli uczestnik używa parametrów odniesienia, referencja jest kolejno przekazywana kolejno do każdej z trzech metod, a każda zmiana za pomocą metody jest widoczna dla następnej metody. Gdy którakolwiek z metod zgłasza wyjątek, który nie jest przechwycony przez metodę, ten wyjątek jest przekazywany do wywołującego delegata i nie są wywoływane żadne kolejne metody na liście wywołań.

Aktualizacja

Obie wywodzą się z delegatów System.Delegate Można użyć metod combine() dodanie dwóch delegatów razem.

+0

Tak, znam dodatkowe prace. Pytam, jak działa dodatek. Na przykład, jak można symulować dokładnie to samo zachowanie bez korzystania z operatora +. Czy istnieje funkcja do użycia? –

+0

Ah, rozumiem, zaktualizowany. – Prescott

+0

Czy trzeba rzutować tak: "SomeDelegate c = (SomeDelegate) Delegate.Combine (a, b);'? Czy operator + również to robi wewnętrznie? –

3

Jest to wykonywane przy użyciu metody statycznej Delegate.Combine.

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

Podczas korzystania z operatora += w rzeczywistości jest tak samo.

// 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 klasy (klasa za delegate hasła) mają listę wywołań, ale ta lista jest niezmienna. Za każdym razem, gdy łączysz delegatów z operatorem +=, tworzona jest nowa instancja MulticastDelegate, która łączy listę wywołań dwóch poprzednich obiektów Delegata.