In diesem Beitrag geht es um den Nutzen, Sinn und die Funktion von delegates (zu Deutsch Delegaten).
Im Threading Artikel habe ich solch einen schon genutzt um einen anonyme Methode aufzurufen.

Was ist ein Delegate?
Eigentlich nichts weiter als ein Verweis auf eine bestehende Methode.
Codemäßig sieht man auch gleich, dass dieser delegate keinen Methodenrumpf hat und einem Aufruf verblüffend ähnlich sieht, nur dass er – im Gegensatz zu Methodenaufrufen – Parameter benötigt.

 private delegate int myDelegate(int x, int y); 

Nun haben wir einen delegate erzeugt, welcher als Parameter 2 Integer(32)-Werte annimmt und einen int32-Wert (das Ergebnis der Rechnung) zurück gibt.
Nun können wir diesen delegate nutzen um eine Methode aufzurufen.

Erstellen wir hier mal eine Methode

 private void multiplyValues(int x, int y) 

.

 private int multiplyValues(int x, int y) {
 return x * y;
} 

Wichtig ist, dass diese die gleichen Eigenschaften (Parameter, Rückgabewert) hat, wie der delegate!

Nun können wir den delegate als Verweis auf die Methode nutzen:

 myDelegate myMultiplyDelegate = new myDelegate(multiplyValues); 
int result = myMultiplyDelegate(2, 4);  

Multicasting Delegates
Multicasting bezeichnet die Möglichkeit mehrere delegate-Aufrufe in einem zusammen zu fassen.
Dieser Zusammenschluss wird als Multicast-Delegate bezeichnet.
So kann man schnell und einfach mehrere delegates in einer Reihenfolge ausführen.

In meinem Beispiel wollen wir nun eine minder komplexe mathematische Berechnung ausführen.

Erstellen wir dazu erstmal die benötigten Methoden:

 private int divideValues(int x, int y) {
 return x / y;
} 
 private int multiplyValues(int x, int y) {
 return x * y;
} 

Nun haben wir einmal die Funktion zum Teilen und die Funktion zum Multiplizieren.

Diese werden nun mit Hilfe zweier delegates verwiesen:

 myDelegate divDelegate = new myDelegate(divideValues); 
 myDelegate multiplyDelegate = new myDelegate(multiplyValues); 

Nun führen wir die zwei delegates zu einem delegate zusammen:

 myDelegate getPercentage; 
getPercentage = divDelegate;
getPercentage += multiplyDelegate

Führen wir den delegate nun aus:

 int result = getPercentage(98, 100); 

Nun wird zuerst die divideValues Methode aufgerufen (d.h. 98/100). Anschließend wird das Ergebnis mit 100 wird multipliziert.
Das Ergebnis (int result) wird also 98 sein.

Nun ist das ganze nicht so schön, da man für alle delegates nur die Anfangsparameter nutzt.

Die Lösung dafür sind sogenannte references.

delegate void myDelegate(ref int x, ref int y); 

Natürlich müssen die Methoden auch hier referenzierte Parameter erwarten.

Dazu aber mehr in einem anderen Blogpost.