Delegate in C#

C# ist eine objektorientierte Programmiersprache, welche unsichere Elemente, wie etwa Zeiger (Pointer), grundsätzlich vermeidet. Dennoch sind Zeiger nicht nur in Augen von C/C++-Entwicklern in einigen Fällen einfach notwendig, so z.B. die Funktionszeiger.

Delegates sind Funktionszeiger in C#. Sie zeigen auf mindestens eine Funktion bzw. Methode. Benutzt wird ein Delegate in C# zum Beispiel für Events.

Ein Delegate wird in C# nach folgendem Schema definiert:

[Öffentlichkeitsparameter] delegate Rückgabewert Delegatename ([Methodenparametertyp Methodenparametername] );

Das Delegate weiß bereits im Vorfeld über die Parameter und dem Rückgabewert der Methode(n) bescheid, auf die es später verweisen soll.

Im nachfolgendem Beispiel ist ein Delegate in einer Klasse definiert, welches…
[csharp]

public delegate string FPointer (int index);

[/csharp]

… auf die nachstehende Methode stringcode verweisen soll (dem ist jedoch NOCH nicht so):

[csharp]

private string stringcode(int code_number) // Funktion, welche vom Delegate aufgerufen wird
{
string error_message;

switch (code_number)
{
case 1:
error_message = “Fehler in der Datenbank”;
break;
case 2:
error_message = “Fehler in der Syntax”;
break;
case 3:
error_message = “Fehler in der Benutzereingabe”;
break;
default:
error_message = “Undefinierter Fehler”;
break;
}

return error_message;
}

[/csharp]

Um das Delegate auf die Methode stringcode zeigen zu lassen, muss es deklariert und instanziiert werden. Mit einem aus der Instanziierung resultierenden Objekt des Delegates kann dann die Zuweisung durch den Methodennamen als Parameter geschehen. Die Methode muss dabei (wie bereits erwähnt) bezüglich Rückgabewert und Parametern der Definition des Delegates entsprechen.

[csharp]

FPointer fp; // Deklaration des Delegates
fp = new FPointer(stringcode); // Funktions-Zuweisung des Delegates (durch Instanziierung)

[/csharp]

Das Delegate fp zeigt nun auf die Methode stringcode. Es kann nun auch als Methode behandelt werden. Wird die Methode via Delegate aufgerufen, zum Beispiel mit dem Integer-Wert 1….:

[csharp]

string return_str = fp(1); // Aufruf des Delegates

Console.WriteLine(return_str); // Ausgabe

[/csharp]

…erscheint in der Console folgende Ausgabe:

Fehler in der Datenbank