Verfasst von: bletra | 3. Oktober 2010

Delegates (Teil 3 von 6): Multicast Delegate

Schon im ersten Teil dieser Serie wurde deutlich gemacht, dass alle Delegate von System.MulticastDelegate erben – ob man möchte oder nicht. Multicast bedeutet, dass eine Delegat-Variable nicht nur eine Methode, sondern mehrere Methoden aufnehmen kann. Diese werden alle aufgerufen, wenn man die Delegat-Variable aufruft. In welcher Reihenfolge diese aufgerufen werden, ist nicht verbindlich – auch wenn ich häufig beobachte, dass die Methoden in der Reihe des Hinzufügens aufgerufen werden. Betrachten wir eine Delegatdefinition aus Teil 1:

delegate double MathDelegate(double angle);
MathDelegate calculator;
calculator = Math.Sin

Die Instanz calculator hält momentan eine Referenz auf Math.Sin vorrätig. Weitere Methoden lassen sich durch += hinzufügen oder durch -= entfernen:

calculator += Math.Cos
calculator += Math.Tan
calculator -= Math.Sin
Console.WriteLine(calculator(45))

Welcher Wert wird nun in der letzten Zeile ausgegeben? Es werden alle Methoden ausgeführt und als Rückgabewert wird der Wert der zuletzt ausgeführten Methode genommen, also höchstwahrscheinlich wird der Tangens ausgegeben.
Aus diesem Grund ist der bewusste Einsatz von MulticastDelegaten, also Delegatvariablen, die mehr als eine Methode aufnehmen sollen, nur für void-Methoden sinnvoll. .Net erzwingt dies jedoch nicht. Ähnlich wie mit dem Rückgabewert verhält es sich mit möglichen als „out“ deklarierten Funktionsargumenten.

Betrachten wir nun also ein Beispiel, mit einer Methodensignatur ohne Rückgabewert (also void). Wir können auch hier Lambda-Ausdrücke verwenden:

Delegate void Greeting(string x);
Greeting welcome;
welcome = (x) => { Console.WriteLine(x + "1"); };
welcome += (x) => { Console.WriteLine(x + "2"); };
welcome += (x) => { Console.WriteLine(x + "3"); };
welcome -= (x) => { Console.WriteLine(x + "1"); };
welcome("hi");

Hier zeigt sich, dass diese Schreibweise, zwar ein Hinzufügen, jedoch kein Entfernen erlaubt, d.h. es wird

hi1
hi2
hi3

ausgegeben.
Wird ein Entfernen (unsubsribe) gewünscht, so müssen „echte“ Methoden angegeben werden, wie z.B.:

static void Hi(string x)
{
  Console.WriteLine(x + "Hi");
}
welcome += Hi;
welcome -= Hi;

Multicast Delegate sind DIE Basis für Events, auf die ich im nächsten Artikel eingehen werde.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Kategorien

%d Bloggern gefällt das: