Delegates mit .NET

Delegates vs. Funktionen

Die Deklaration eines Delegates erfolgt genauso wie die Deklaration einer Funktion. Beschrieben wird dabei aber eben nur die Signatur der Funktion, die mit dem Delegate assoziiert wird.

Für das Log-Beispiel braucht es beispielsweise eine Funktion, die keinen Rückgabewert hat (void) und die als Parameter einen einzelnen String erhält, der geloggt werden soll. Der Delegate für eine Funktion mit einer solchen Signatur hat dann folgendes Aussehen:

public delegate void Logger( string msg);

Dieser Delegate kann nun im Beispiel der Klasse "Aclass" verwendet werden. Dazu wird die Signatur von DoIt verändert - die Funktion bekommt nun einen Parameter vom Typ Logger:

public class AClass {
public delegate void Logger( String msg);

public void DoIt( Logger log) {
if( log != null) {
log("DoIt() Wurde aufgerufen");
}
// hier leistet DoIt seine Arbeit
if( log != null) {
log("DoIt() wird verlassen");
}
}
}

Der an DoIt übergebene Delegate kann einfach aufgerufen werden, ganz so als würde es sich um eine normale Funktion handeln. Da ein Delegate aber auch null sein kann - in diesem Fall zeigt er nicht auf eine Funktion -, muss das vor dem Aufruf von log zunächst überprüft werden. Das hat auch einen ganz praktischen Aspekt: Will man im Programm keine Log-Informationen generieren, ruft man DoIt einfach mit null als Parameter auf.

Die interessantere Frage aber ist: Was muss man tun, um eine Instanz eines Delegates zur erhalten, mit der man DoIt dann aufrufen kann? Ganz einfach: Man muss mindestens eine Funktion schreiben, deren Signatur der des Delegates entspricht. Dann braucht es eine Delegate-Instanz, die auf diese Funktion zeigt und die dann beim Aufruf von DoIt übergeben werden kann.