C#, fonksiyonlara metotları parametre olarak geçmenize olanak tanır; bu da kodun esnekliğini ve yeniden kullanılabilirliğini önemli ölçüde artırır. Bu özellik, geri çağırma fonksiyonları, olay işleyicileri ve çalışma zamanı davranışının belirli işlemi dikte ettiği stratejik kalıpların uygulanması için çok önemlidir. Bu makale, özel delege, Func<>
ve Action<>
kullanarak bunu başarmanın çeşitli yaklaşımlarını ele almaktadır.
İçindekiler
- Metotları Parametre Olarak Geçirmek İçin Özel Delege Kullanımı
Func<>
Delege’sinden FaydalanmaAction<>
Delege’sini Kullanma- Sonuç
Metotları Parametre Olarak Geçirmek İçin Özel Delege Kullanımı
C#’taki delege, tür güvenli fonksiyon işaretçileri görevi görür. Metot imzası yerleşik Func<>
veya Action<>
delege’lerinden farklı olduğunda, özel bir delege oluşturmak daha ayrıntılı kontrol ve açıklık sağlar. Bir sayı üzerinde işlem yapan ve ardından sonucu gösteren bir fonksiyonu ele alalım; burada işlem kendisi bir parametredir.
// Özel bir delege tanımlayın
public delegate double MathOperation(double x);
public class Example
{
public static void PerformOperationAndPrint(double num, MathOperation operation)
{
double result = operation(num);
Console.WriteLine($"Sonuç: {result}");
}
public static double Square(double x) => x * x;
public static double Cube(double x) => x * x * x;
public static void Main(string[] args)
{
PerformOperationAndPrint(5, Square); // Çıktı: Sonuç: 25
PerformOperationAndPrint(5, Cube); // Çıktı: Sonuç: 125
}
}
MathOperation
, bir double
alan ve bir double
döndüren bir metodu temsil eden bir delege görevi görür. PerformOperationAndPrint
bu delegeyi kabul eder ve Square
, Cube
veya uyumlu herhangi bir metodun kullanımına olanak tanır.
Func<>
Delege’sinden Faydalanma
Func<>
, sıfır veya daha fazla giriş parametresi ve bir dönüş değeri olan bir metodu temsil eden genel bir delege’dir. Yerleşik yapısı birçok senaryoyu basitleştirir. Önceki örneği yeniden düzenleyelim:
public class Example
{
public static void PerformOperationAndPrint(double num, Func<double, double> operation)
{
double result = operation(num);
Console.WriteLine($"Sonuç: {result}");
}
public static double Square(double x) => x * x;
public static double Cube(double x) => x * x * x;
public static void Main(string[] args)
{
PerformOperationAndPrint(5, Square); // Çıktı: Sonuç: 25
PerformOperationAndPrint(5, Cube); // Çıktı: Sonuç: 125
}
}
Bu, daha az kodla aynı sonucu elde eder. Func<double, double>
, bir double
alan ve bir double
döndüren bir metodu belirtir. Genel tür parametreleri çeşitli metot imzalarına uyar (örneğin, Func<int, string>
).
Action<>
Delege’sini Kullanma
Action<>
, sıfır veya daha fazla giriş parametresi ve void
dönüş türüne (dönüş değeri yok) sahip metotlar için genel bir delege’dir. Metotlar değer döndürmediğinde kullanın.
public class Example
{
public static void PerformAction(string message, Action<string> action)
{
action(message);
}
public static void PrintMessage(string msg) => Console.WriteLine(msg);
public static void PrintMessageToUpper(string msg) => Console.WriteLine(msg.ToUpper());
public static void Main(string[] args)
{
PerformAction("Merhaba, dünya!", PrintMessage); // Çıktı: Merhaba, dünya!
PerformAction("Merhaba, dünya!", PrintMessageToUpper); // Çıktı: MERHABA, DÜNYA!
}
}
Action<string>
, bir dize alan ve hiçbir şey döndürmeyen bir metodu temsil eder. PerformAction
, çeşitli yazdırma işlemlerini yürütmek için bunu kullanır.
Sonuç
Metotları parametre olarak geçirmek güçlü bir C# özelliğidir. Özel delege’ler maksimum kontrol sunarken, Func<>
ve Action<>
uygun yerleşik çözümler sağlar. En iyi yaklaşım, uygulamanızın belirli gereksinimlerine bağlıdır. Bu tekniklerde uzmanlaşmak, daha uyarlanabilir ve sürdürülebilir C# kodları yazmanın anahtarıdır.