Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Delegates sind Typen, denen Sie eine Methode zuweisen, die sie dann über das Delegate ausführen können. Ein Delegate legt dabei nur fest, welchen Rückgabewert und welche Parameter die zu verwendende Methode nutzt – Sie können dem Delegate zur Laufzeit dann beliebige Methoden zuweisen, die dieser Signatur entsprechen. Delegates benötigen Sie aber auch, wenn Sie Klassen mit benutzerdefinierten Ereignissen programmieren möchten. In diesem Fall nutzen Sie ein Delegate, um die beim Eintreten des Ereignisses auszuführende Methode festzulegen.
In diesem Artikel schauen wir uns zunächst an, wie ein Delegate funktioniert, und erläutern erst im Anschluss, welchen Nutzen dies hat. Angenommen, Sie haben zwei Methoden, welche die gleichen Parameter nutzen, aber verschiedene Dinge erledigen. Ein schönes Beispiel ist dabei das Addieren und das Multiplizieren zweier Zahlen. Die beiden Methoden würden dann etwa wie folgt aussehen:
public static int Summe(int a, int b) { return a + b; } public static int Produkt(int a, int b) { return a * b; }
Wollen Sie nun eine dieser Methoden aufrufen, würden Sie dies beispielsweise wie folgt erledigen:
Console.WriteLine("Summe aus 2 und 3: {0}, Summe(2, 3));
Zum Multiplizieren rufen Sie einfach die Methode Produkt auf:
Console.WriteLine("Produkt aus 2 und 3: {0}, Produkt(2, 3));
Wenn Sie beim Erstellen des Projekts noch nicht wissen, welche der Methoden an einer bestimmten Stelle zum Einsatz kommen wird, fragen Sie beispielsweise den Benutzer danach und codieren die Aufrufe dann direkt in die Bedingung:
public static void Test_SummeOderProdukt() { Console.WriteLine("Möchten Sie multiplizieren (*) oder addieren (+)"); string operation = Console.ReadLine(); if (operation == "*") { Console.WriteLine("Produkt aus 2 und 3: {0}", Produkt(2, 3)); } else { Console.WriteLine("Summe aus 2 und 3: {0}", Summe(2, 3)); } Console.ReadLine(); }
Aufruf per Delegate
Diese beiden Methoden wollen wir nun über eine einzige Methode aufrufen, wobei wir dieser Methode zuvor den Namen der zu verwendenden Methode (also Summe oder Produkt) übergeben, damit diese weiß, welche Methode sie nutzen soll. Diese gemeinsame Methode heißt dann allerdings nicht mehr Methode, sondern Delegate, und es ist auch keine Methode mehr, sondern ein Objekt. Dieses deklarieren wir wie folgt:
public delegate int Berechnung(int a, int b);
Die Unterschiede zu einer herkömmlichen Methode sind offensichtlich: Erstens verwenden wir bei der Deklaration das Schlüsselwort delegate. Zweitens hat dieses Delegate im Gegensatz zu einer Methode nur eine Deklaration, aber keinen in geschweiften Klammern befindlichen Programmcode. Nun wollen wir über das Delegate Berechnung zunächst die Funktion Summe aufrufen. Dazu erstellen wir ein neues Objekt auf Basis des Delegates Berechnung. Dabei übergeben wir dem Konstruktor den Namen der Methode, die wir verwenden wollen. Und statt der Methode Summe() rufen wir nun das Delegate-Objekt berechnung unter Angabe der zu addierenden Zahlen auf: