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 TypTResult
zurück.Func<T, TResult>
: Akzeptiert eine Eingabevariable vom TypT
und gibt einen Wert vom TypTResult
zurück.Func<T1, T2, TResult>
: Akzeptiert zwei Eingabevariablen und gibt einen Wert vom TypTResult
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 TypT
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");
}
}
}