C# ermöglicht es Ihnen, Methoden als Parameter an Funktionen zu übergeben, wodurch die Flexibilität und Wiederverwendbarkeit des Codes erheblich verbessert wird. Diese Fähigkeit ist entscheidend für die Implementierung von Callbacks, Ereignisbehandlungen und strategischen Mustern, bei denen das Laufzeitverhalten die spezifische Aktion bestimmt. Dieser Artikel untersucht verschiedene Ansätze, um dies zu erreichen, wobei der Schwerpunkt auf benutzerdefinierten Delegaten, Func<>
und Action<>
liegt.
Inhaltsverzeichnis
- Verwenden von benutzerdefinierten Delegaten zum Übergeben von Methoden als Parameter
- Verwendung des
Func<>
-Delegaten - Verwendung des
Action<>
-Delegaten - Fazit
Verwenden von benutzerdefinierten Delegaten zum Übergeben von Methoden als Parameter
Delegaten in C# dienen als typsichere Funktionszeiger. Die Erstellung eines benutzerdefinierten Delegaten bietet granulare Kontrolle und Klarheit, wenn die Methodensignatur von den integrierten Func<>
– oder Action<>
-Delegaten abweicht. Betrachten Sie eine Funktion, die eine Operation an einer Zahl durchführt und dann das Ergebnis anzeigt, wobei die Operation selbst ein Parameter ist.
// Definition eines benutzerdefinierten Delegaten
public delegate double MathOperation(double x);
public class Beispiel
{
public static void OperationAusführenUndAusgeben(double num, MathOperation operation)
{
double result = operation(num);
Console.WriteLine($"Ergebnis: {result}");
}
public static double Quadrat(double x) => x * x;
public static double Kubus(double x) => x * x * x;
public static void Main(string[] args)
{
OperationAusführenUndAusgeben(5, Quadrat); // Ausgabe: Ergebnis: 25
OperationAusführenUndAusgeben(5, Kubus); // Ausgabe: Ergebnis: 125
}
}
MathOperation
fungiert als Delegat, der eine Methode darstellt, die einen double
akzeptiert und einen double
zurückgibt. OperationAusführenUndAusgeben
akzeptiert diesen Delegaten, wodurch die Verwendung von Quadrat
, Kubus
oder jeder konformen Methode ermöglicht wird.
Verwendung des Func<>
-Delegaten
Func<>
ist ein generischer Delegat, der eine Methode mit null oder mehr Eingabeparametern und einem Rückgabewert darstellt. Seine integrierte Natur vereinfacht viele Szenarien. Lassen Sie uns das vorherige Beispiel umgestalten:
public class Beispiel
{
public static void OperationAusführenUndAusgeben(double num, Func<double, double> operation)
{
double result = operation(num);
Console.WriteLine($"Ergebnis: {result}");
}
public static double Quadrat(double x) => x * x;
public static double Kubus(double x) => x * x * x;
public static void Main(string[] args)
{
OperationAusführenUndAusgeben(5, Quadrat); // Ausgabe: Ergebnis: 25
OperationAusführenUndAusgeben(5, Kubus); // Ausgabe: Ergebnis: 125
}
}
Dies erreicht das gleiche Ergebnis mit weniger Code. Func<double, double>
gibt eine Methode an, die einen double
akzeptiert und einen double
zurückgibt. Generische Typparameter passen sich verschiedenen Methodensignaturen an (z. B. Func<int, string>
).
Verwendung des Action<>
-Delegaten
Action<>
ist ein generischer Delegat für Methoden mit null oder mehr Eingabeparametern und einem void
-Rückgabetyp (kein Rückgabewert). Verwenden Sie ihn, wenn Methoden keine Werte zurückgeben.
public class Beispiel
{
public static void AktionAusführen(string message, Action<string> action)
{
action(message);
}
public static void NachrichtAusgeben(string msg) => Console.WriteLine(msg);
public static void NachrichtInGrossbuchstabenAusgeben(string msg) => Console.WriteLine(msg.ToUpper());
public static void Main(string[] args)
{
AktionAusführen("Hallo, Welt!", NachrichtAusgeben); // Ausgabe: Hallo, Welt!
AktionAusführen("Hallo, Welt!", NachrichtInGrossbuchstabenAusgeben); // Ausgabe: HALLO, WELT!
}
}
Action<string>
repräsentiert eine Methode, die eine Zeichenkette akzeptiert und nichts zurückgibt. AktionAusführen
verwendet dies, um verschiedene Druckaktionen auszuführen.
Fazit
Das Übergeben von Methoden als Parameter ist eine leistungsstarke C#-Funktion. Benutzerdefinierte Delegaten bieten maximale Kontrolle, während Func<>
und Action<>
bequeme integrierte Lösungen bieten. Der beste Ansatz hängt von den spezifischen Anforderungen Ihrer Anwendung ab. Die Beherrschung dieser Techniken ist der Schlüssel zum Schreiben anpassungsfähigeren und wartungsfreundlicheren C#-Codes.