Zum Hauptinhalt springen

Func und Action Delegate

Func und Action sind zwei wichtige generische Delegat-Typen, die häufig verwendet werden, um Methoden als Parameter an andere Methoden zu übergeben oder als Rückgabewert aus Methoden zurückzugeben. Sie erleichtern die Arbeit mit Delegaten und die Definition von Funktionen mit variabler Anzahl von Parametern.

Func

Func ist ein generischer Delegattyp, der eine oder mehrere Eingabevariablen akzeptiert und eine Rückgabevariable hat. Der generische Typ TResult gibt den Typ des Rückgabewerts an. Es gibt verschiedene Versionen von Func, je nach Anzahl der Eingabevariablen. Zum Beispiel:

  • Func<TResult>: Akzeptiert keine Eingabevariablen und gibt einen Wert vom Typ TResult zurück.
  • Func<T, TResult>: Akzeptiert eine Eingabevariable vom Typ T und gibt einen Wert vom Typ TResult zurück.
  • Func<T1, T2, TResult>: Akzeptiert zwei Eingabevariablen und gibt einen Wert vom Typ TResult zurück.

Hier ist ein einfaches Beispiel, das Func verwendet:

Func<int, int, int> add = (x, y) => x + y;
int result = add(3, 5); // result = 8

In diesem Beispiel verwendet Func<int, int, int> eine Funktion, die zwei int-Parameter akzeptiert und einen int-Rückgabewert hat.

Action

Action ist ein generischer Delegattyp, der keine Rückgabevariable hat, sondern nur eine oder mehrere Eingabevariablen. Wie Func gibt es verschiedene Versionen von Action, je nach Anzahl der Eingabevariablen. Zum Beispiel:

  • Action: Akzeptiert keine Eingabevariablen und hat keine Rückgabevariable.
  • Action<T>: Akzeptiert eine Eingabevariable vom Typ T und hat keine Rückgabevariable.
  • Action<T1, T2>: Akzeptiert zwei Eingabevariablen und hat keine Rückgabevariable.

Hier ist ein einfaches Beispiel, das Action verwendet:

Action<string> greet = (name) => Console.WriteLine($"Hello, {name}!");
greet("John"); // Gibt "Hello, John!" auf der Konsole aus

In diesem Beispiel verwendet Action<string> eine Funktion, die einen string-Parameter akzeptiert und keine Rückgabe hat.

Beide Func und Action sind nützliche Werkzeuge, um Methoden als Parameter an andere Methoden zu übergeben, was besonders in LINQ-Abfragen und bei der Arbeit mit Delegaten und Ereignissen hilfreich ist. Sie ermöglichen auch eine kompakte und lesbare Syntax für die Definition von Funktionen mit variabler Anzahl von Parametern.

Calculator Beispiel aus Delegate mit Func

internal class Program
{
static void Main(string[] args)
{
Func<double, double, double> calculator;

while (true)
{
Console.WriteLine("1 - Addieren, 2 - Subtraieren, 3 - Mulipilzieren, 4 - Dvidieren:");
int choice = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Nummber 1: ");
double number1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Number 2: ");
double number2 = Convert.ToDouble(Console.ReadLine());

switch (choice)
{
default:
calculator = (x, y) => x + y;
break;
case 2:
calculator = (x, y) => x - y;
break;
case 3:
calculator = (x, y) => x * y;
break;
case 4:
calculator = (x, y) => x / y;
break;
}
double result = calculator(number1, number2);
Console.WriteLine($"Das Ergebnis ist {result}\n\n");
}
}
}

Kommentare