Bryan Albrecht

Delegates in CSharp

Wenn man zuvor noch nie von Delegates gehört hat, kann man sich nicht vorstellen, für was man so etwas überhaupt gebrauchen kann. Mit diesem Beitrag möchte ich dieses gerne etwas erläutern.

Einfach gesagt, ist ein Delegate ein Verweis auf eine oder Mehrere Methoden. Die referenzierten Methoden können über den Delegate aufgerufen werden. Dies kann für einen dynamischen Code benutzt werden, in welchem teilweise unterschiedliche Methoden aufgerufen werden sollen, welche jedoch die gleichem Parameter und denselben Rückgabewert besitzen.

Aufbau

Ein Delegate ist vom Aufbau her einer Methode sehr ähnlich. Diese unterscheiden sich jedoch in manchen Punkten auch sehr stark, da ein Delegate keine Logik besitzt. Genauer gesagt, wir nur definiert, wie der Delegate heisst, was er zurück gibt und welche Parameter er besitzt. Ein einfaches Beispiel dafür ist dieses:

  1. private delegate void myDelegate(string myString, string myString2);

Damit ein Delegate auf eine Methode zeigen kann, muss man zuerst eine oder mehrere Methoden erstellen.

  1. private void method1(string str1, string str2)
  2. {
  3. //Code
  4. }
  5. private void method12(string str1, string str2)
  6. {
  7. //Code
  8. }

Die Logik dieser beiden Methoden spielt für dieses Beispiel keine Rolle.
Ein Delegate wird wie folgt erstellt:

  1. myDelegate myOwnDelegate = new myDelegate (method1);

Um die dem mOwnDelegate zugewiesene Methode aufzurufen, kann man folgendes aufrufen:

  1. myOwnDelegate(“Hello“,“World“);

In diesem Beispiel wird die zu referenzierende Methode gleich beim Erstellen definiert.
Dies muss jedoch nicht immer der Fall sein. Es kann auch ein Delegate ohne referenzierte Methode erstellt werden. Dies sieht dann so aus:

  1. myDelegate myOwnDelegate2;

Diesem Delegate kann nachträglich noch eine Referenz zugewiesen werden:

  1. myOwnDelegate2 = new myDelegate (method2);

Multicasting

Einem Delegate kann nicht nur eine Methode Referenziert werden. Es ist möglich ihm eine ganze Liste an Methoden zu referenzieren. Dies sieht dann so aus:

  1. myDelegate myOwnDelegate3;
  2. myOwnDelegate3 = new myDelegate (method1);
  3. myOwnDelegate3 += new myDelegate (method2);

Die referenzierten Methoden werden dann in der hinzugefügten Reihenfolge aufgerufen.