C# 2.0 ile gelen bir yeniliktir. Bir delege nesnesi oluşturulması esnasında, işaret edeceği metodunda aynı anda tanımlanmasıdır. C#’da metot içinde metot tanımlanmasının tek istisnai durumudur. Anonim metodun en önemli özelliklerinden birisi de, içerisine yazılmış olduğu metodun local değişkenlerini kullanabilmesidir.
Bir metot sadece anlık olarak işimize yarayacaksa o metodu ayrı bir isimle tanımlamak yerine, anonim olarak yazmayı tercih ederiz. Kullan-At tarzı metotları anonim olarak tasarlarız. Şimdi ufak bir örnek üzerinde inceleme yapalım.
namespace AnonimMetot
{
delegate int Matematik(int sayi);
class Program
{
static void Main(string[] args)
{
Matematik canta = KareAl;
}
static int KareAl(int x)
{
return x * x;
}
}
}
Yukarıdaki kod parçasında Matematik tipinden olan canta adlı delegemize KareAl adlı metodu bağladık. Bu metodun sadece tanımlandığı anda iş yaptığını düşünelim. Yani delegeye bağlanmak dışında başka bir görevi olmasın. Bu durumda uzun uzun KareAl adlı metot tanımlamak yerine, metodu anonim olarak tanımlamayı tercih ederiz.
namespace AnonimMetot
{
delegate int Matematik(int sayi);
class Program
{
static void Main(string[] args)
{
Matematik canta = delegate(int a)
{
return a * a;
};
}
}
}
Bu şekilde metodu anonim olarak tanımlamış olduk.
Şimdi de framwork’de varolan Predicate adlı delege üzerinden bir koleksiyon içerisinde arama yapalım. Elimizde List<int> tipinden bir koleksiyon olsun. Bu koleksiyon içerisindeki çift sayıları filtreleyip ayrı bir listeye dolduralım.
static void Main(string[] args)
{
List<int> sayilar = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
}
Şimdi de sayilar degikeni üzerinden FindAll metodunu çağıralım.
Dikkat ederseniz metot bizden Predicate<T> tipinden bir parametre istemekte. Predicate<T>, framework içerisinde varolan bir delegedir. Sayilar değişkenimizdeki T argumanı bir integer olduğundan, metot da bizden Predicate<int> tipinden bir parametre yollamamızı istemektedir. Bir metot parametre olarak bir delege istiyorsa bu, ‘bana bir metot gönder’ ile eş anlamlıdır. Predicate<int> delegesi üzerinden Go to definition dediğimizde, parametre olarak bir int alan ve geriye bool dönen bir imzaya sahip olduğunu görebiliriz. Bu da, parametre olarak integer alıp, geriye bool dönen bir metodu tutabileceği anlamına gelir.
Şimdi de filtrelemeyi yapacak metodu yazıp FindAll metoduna parametre olarak verelim.
class Program
{
static void Main(string[] args)
{
List<int> sayilar = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> ciftSayilar = sayilar.FindAll(CiftMi);
foreach (int sayi in ciftSayilar)
Console.WriteLine(sayi);
}
static bool CiftMi(int sayi)
{
return sayi % 2 == 0;
}
}
Yukarıdaki kod parçasını çalıştırdığımızda 2, 4, 6 ve 8 sayılarını ekranda görebiliriz.
Burada yazmış olduğumuz ‘CiftMi’ metodunu sadece FindAll metoduna parametre geçebilmek için tanımladık. Dolayısı ile bu metodu anonim olarak tanımlamamız daha temiz bir kodlama yapmamızı sağlayacaktır. Şimdi aynı örneği, metodu anonim olarak tasarlayarak yeniden yazalım.
class Program
{
static void Main(string[] args)
{
List<int> sayilar = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> ciftSayilar = sayilar.FindAll(delegate(int sayi)
{
return sayi % 2 == 0;
});
foreach (int sayi in ciftSayilar)
Console.WriteLine(sayi);
}
}
Kodu çalıştırdığımızda yine ekranda 2, 4, 6 ve 8 sayılarını göreceğiz.
3 yorum:
güzel
Eger sadece bu kadarsa iymis, kolaymis :)
Mükemmel. Teşekkürler
Yorum Gönder