Delegates sind ein wichtiges Konzept in der Programmierung mit C#. Sie erlauben es, Methoden als Parameter zu übergeben oder als Rückgabewert zu nutzen. Dies ermöglicht eine höhere Flexibilität und Wiederverwendbarkeit von Code. In diesem Artikel werden wir uns genauer mit dem Konzept der Delegates beschäftigen. Wir werden besprechen, was Delegates sind, wie sie funktionieren und wie sie in der Programmierung verwendet werden.
Was sind C# Delegates? Ein Delegate ist ein Objekt, das auf eine Methode verweist. Es ermöglicht es, Methoden als Parameter zu übergeben oder als Rückgabewert zu nutzen. Mit anderen Worten: Ein Delegate ist ein Funktionszeiger, der es erlaubt, Methoden wie eine Variable zu behandeln. Ein Delegate kann Methoden referenzieren, die denselben Signaturtyp haben wie der Delegate selbst. Eine Signatur besteht aus dem Methodennamen, den Parametern und dem Rückgabetyp.
Wie funktionieren C# Delegates? In C# werden Delegates als Klassen implementiert. Ein Delegate ist eine Klasse, die eine Methode referenziert. Diese Methode muss denselben Signaturtyp haben wie der Delegate selbst. Wenn ein Delegate auf eine Methode verweist, kann er aufgerufen werden, als ob er die Methode selbst wäre. Delegates können auch kombiniert werden, um eine Liste von Methoden zu erstellen, die in einer bestimmten Reihenfolge ausgeführt werden.
Wie werden C# Delegates in der Programmierung verwendet? Delegates werden in der Programmierung verwendet, um Methoden als Parameter zu übergeben oder als Rückgabewert zu nutzen. Ein häufiges Beispiel ist die Verwendung von Delegates in Ereignissen. Wenn ein Ereignis ausgelöst wird, ruft das Ereignis die Methode auf, die vom Delegate referenziert wird. Delegates können auch dazu verwendet werden, Callback-Funktionen zu erstellen oder um Asynchronität zu implementieren.
Beispiele für C# Delegates könnten folgende sein:
public delegate void MeinDelegate(int x);
public class Beispielklasse
{
public static void Methode1(int x)
{
Console.WriteLine("Methode 1: " + x);
}
public static void Methode2(int x)
{
Console.WriteLine("Methode 2: " + x);
}
public static void Main()
{
MeinDelegate del = new MeinDelegate(Methode1);
del(42);
del = Methode2;
del(123);
}
}
Dieses Beispiel definiert einen Delegate namens MeinDelegate
, der eine Methode mit einem Parameter vom Typ int
akzeptiert und keinen Rückgabewert hat. Dann werden zwei Methoden namens Methode1
und Methode2
definiert, die denselben Signaturtyp wie MeinDelegate
haben. In der Main
Methode wird der Delegate del
zuerst auf Methode1
gesetzt und dann auf Methode2
. Wenn der Delegate schließlich aufgerufen wird, wird die entsprechende Methode ausgeführt und der Parameter wird an die Methode übergeben.
public delegate int MathematischeOperation(int x, int y);
public class Mathematik
{
public int Berechne(MathematischeOperation operation, int x, int y)
{
return operation(x, y);
}
}
public class Beispielklasse
{
public static int Addiere(int x, int y)
{
return x + y;
}
public static int Subtrahiere(int x, int y)
{
return x - y;
}
public static void Main()
{
Mathematik mathe = new Mathematik();
int ergebnis = mathe.Berechne(new MathematischeOperation(Addiere), 3, 5);
Console.WriteLine("3 + 5 = " + ergebnis);
ergebnis = mathe.Berechne(new MathematischeOperation(Subtrahiere), 7, 2);
Console.WriteLine("7 - 2 = " + ergebnis);
}
}
In diesem Beispiel definiert die Klasse Mathematik
eine Methode namens Berechne
, die einen Delegate als Parameter akzeptiert und diesen verwendet, um eine andere Methode aufzurufen. Dann werden zwei Methoden namens Addiere
und Subtrahiere
definiert, die denselben Signaturtyp wie der Delegate haben. In der Main
Methode wird eine Instanz der Klasse Mathematik
erstellt und der Delegate wird zweimal aufgerufen, einmal mit Addiere
und einmal mit Subtrahiere
. Das Ergebnis der jeweiligen Berechnung wird ausgegeben.
Hier sind einige Code-Beispiele zum Thema C# Delegates und Callback-Funktionen:
Beispiel 1: Delegate als Parameter einer Methode
public delegate void MeinDelegate(int x);
public class MeineKlasse
{
public static void MethodeMitDelegate(MeinDelegate meinDelegate)
{
// Führe die übergebene Methode aus
meinDelegate(42);
}
}
public class Programm
{
static void Main()
{
MeinDelegate meinDelegate = MeineMethode;
MeineKlasse.MethodeMitDelegate(meinDelegate);
}
static void MeineMethode(int x)
{
Console.WriteLine("Die Zahl ist: " + x);
}
}
In diesem Beispiel definieren wir einen Delegate-Typ namens MeinDelegate
, der eine Methode mit einem int
-Parameter und keinem Rückgabewert darstellt. Dann haben wir eine Klasse namens MeineKlasse
, die eine Methode namens MethodeMitDelegate
definiert, die ein MeinDelegate
-Objekt als Parameter akzeptiert und die übergebene Methode mit dem Wert 42 ausführt. Schließlich haben wir die Main
-Methode, die eine Methode namens MeineMethode
definiert, die der MeinDelegate
-Typ erfüllt, indem sie einen int
-Parameter akzeptiert und keinen Rückgabewert hat. In der Main
-Methode erstellen wir ein MeinDelegate
-Objekt und übergeben es an die MethodeMitDelegate
-Methode von MeineKlasse
, die dann die MeineMethode
-Methode mit dem Wert 42 aufruft.
Beispiel 2: Callback-Funktionen mit Delegates
public delegate void MeinDelegate();
public class MeineKlasse
{
public static void MethodeMitCallback(MeinDelegate callback)
{
// Führe die übergebene Methode aus
callback();
}
}
public class Programm
{
static void Main()
{
MeinDelegate meinDelegate = MeineMethode;
MeineKlasse.MethodeMitCallback(meinDelegate);
}
static void MeineMethode()
{
Console.WriteLine("Die Callback-Methode wurde aufgerufen!");
}
}
In diesem Beispiel definieren wir einen Delegate-Typ namens MeinDelegate
, der eine Methode ohne Parameter und ohne Rückgabewert darstellt. Dann haben wir eine Klasse namens MeineKlasse
, die eine Methode namens MethodeMitCallback
definiert, die ein MeinDelegate
-Objekt als Parameter akzeptiert und die übergebene Methode ausführt. Schließlich haben wir die Main
-Methode, die eine Methode namens MeineMethode
definiert, die der MeinDelegate
-Typ erfüllt, indem sie keine Parameter akzeptiert und keinen Rückgabewert hat. In der Main
-Methode erstellen wir ein MeinDelegate
-Objekt und übergeben es an die MethodeMitCallback
-Methode von MeineKlasse
, die dann die MeineMethode
-Methode aufruft.
Delegates werden häufig in der Event-Verarbeitung in C# verwendet. Ein Delegate wird verwendet, um eine Methode zu verknüpfen, die ausgeführt wird, wenn das Ereignis ausgelöst wird. Hier ist ein Beispiel:
public delegate void EventHandler(object sender, EventArgs e);
public class Button
{
public event EventHandler Click;
public void OnClick()
{
Click?.Invoke(this, EventArgs.Empty);
}
}
public class Program
{
static void Main(string[] args)
{
Button button = new Button();
button.Click += new EventHandler(OnButtonClick);
// Klickereignis auslösen
button.OnClick();
}
static void OnButtonClick(object sender, EventArgs e)
{
Console.WriteLine("Button wurde geklickt!");
}
}
In diesem Beispiel wird ein Delegate mit dem Namen „EventHandler“ definiert, der eine Methode mit dem Signatur „void MethodName(object sender, EventArgs e)“ repräsentiert. Die Klasse „Button“ hat ein Ereignis „Click“, das diesem Delegate-Typ entspricht. Die Methode „OnClick“ löst das Ereignis aus, indem sie das Delegate aufruft. Der EventHandler wird schließlich mit einer Methode namens „OnButtonClick“ verknüpft, die ausgeführt wird, wenn das Click-Ereignis ausgelöst wird.
Delegates können auch in Linq-Abfragen verwendet werden, um die Abfrageergebnisse an eine spezifische Methode zu übergeben. Hier ist ein Beispiel:
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
int[] numbers = { 1, 2, 3, 4, 5 };
// Verwendung eines Delegaten, um jedes Element in der Liste auszugeben
Action printNumber = x => Console.WriteLine(x);
// Filtern der Zahlen, die größer als 3 sind, und Ausgabe mit Delegat
var result = numbers.Where(x => x > 3);
result.ToList().ForEach(printNumber);
}
}
In diesem Beispiel wird ein Delegate vom Typ „Action<int>“ definiert, der eine Methode mit einem Parameter vom Typ „int“ repräsentiert. Der Delegate wird verwendet, um jedes Element in der Liste der Zahlen auszugeben, die größer als 3 sind.
Delegates können auch in der Multithreading-Programmierung verwendet werden, um die Ausführung von Methoden auf anderen Threads zu planen. Hier ist ein Beispiel:
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
// Verwendung eines Delegaten, um eine Methode auf einem anderen Thread auszuführen
Action printHello = () => Console.WriteLine("Hello from another thread!");
// Starten eines neuen Threads und Ausführen der Methode über den Delegaten
Thread thread = new Thread(new ThreadStart(printHello));
thread.Start();
Console.WriteLine("Hello from the main thread!");
}
}
In diesem Beispiel wird ein Delegate vom Typ „Action“ verwendet, um eine Methode auf einem anderen Thread auszuführen.
Fazit: C# Delegates sind ein leistungsfähiges Konzept, das es ermöglicht, Methoden als Parameter zu übergeben oder als Rückgabewert zu nutzen. Sie erhöhen die Flexibilität und Wiederverwendbarkeit von Code und können in vielen Situation
Erstelle eine Methode, die zwei Parameter vom Typ int annimmt und sie addiert. Übergebe dann diese Methode als Delegate-Parameter an eine andere Methode, die den Delegate ausführt und das Ergebnis auf der Konsole ausgibt.
public delegate int MeinDelegate(int a, int b);
public class Rechner
{
public static void AddierenUndAusgeben(MeinDelegate del, int a, int b)
{
int ergebnis = del(a, b);
Console.WriteLine("Das Ergebnis ist: " + ergebnis);
}
}
public class Programm
{
static void Main()
{
MeinDelegate addieren = (x, y) => x + y;
Rechner.AddierenUndAusgeben(addieren, 5, 7);
}
}
In diesem Beispiel wird ein Delegate vom Typ MeinDelegate erstellt, der zwei Parameter vom Typ int akzeptiert und einen int zurückgibt. Dann wird eine Methode namens AddierenUndAusgeben definiert, die diesen Delegate als Parameter akzeptiert sowie zwei int-Parameter. Die Methode führt den Delegate aus, indem sie ihm die beiden int-Parameter übergibt und das Ergebnis auf der Konsole ausgibt.
In der Main-Methode wird dann ein Delegate vom Typ MeinDelegate erstellt, der eine Lambda-Ausdrucksfunktion verwendet, um die Addition von zwei Zahlen durchzuführen. Anschließend wird die Methode AddierenUndAusgeben aufgerufen und das Delegate sowie die beiden Zahlen als Parameter übergeben. Das Ergebnis wird auf der Konsole ausgegeben.