Merhabalar ,
Delegate Nedir?
Ne işimize yarayacak dediğiniz şeylerden biridir.Şaka şaka hemen anlatiyim örneğin elinizde 2 sayı var ve bunları işlemlere tabi tutmak istiyorsunuz örneğin toplama çıkarma çarpma işlemlerini yapacaksınız Bir delegate sayesinde bir kere fonksiyonları oluşturduktan sonra fonksiyonları delegeye ekleriz ve her işlem yapmak istediğimizde iki sayıyı veririz bu üç işlemi de yapmış oluruz hemen geçelim bakalım nasılmış.
Bir delegate oluşturmak çok kolaydır dikkat etmeniz gereken kısım sınıfın içinde fonksiyonların dışında yazmanızdır.
1
| delegate void myDelege(int sayi1, int sayi2);
|
Örneğin yukarıda bir delege oluşturdum Adına da myDelegete yazdım şimdi de bu delegenin içinde toplayacağım fonksiyonları bırakayım aşağıya.
1
2
3
4
5
| public static void SayilariTopla(int sayi1, int sayi2)
{
Console.WriteLine("Sayıları topladım");
Console.WriteLine(sayi1 + sayi2);
}
|
1
2
3
4
5
| public static void SayilariCarp(int sayi1,int sayi2)
{
Console.WriteLine("Sayıları çarptım");
Console.WriteLine(sayi1*sayi2);
}
|
1
2
3
4
5
| public static void SayilariCikar(int sayi1, int sayi2)
{
Console.WriteLine("Sayıları birbirinden çıkardım");
Console.WriteLine(sayi1-sayi2);
}
|
Sırayla Toplama çarpma ve çıkarma işlemlerini yaptırdım şimdi de main classının içerisinde bu fonksiyonları delegeme aktarayım.
1
2
3
| myDelege dlg = new myDelege(SayilariTopla);
dlg += SayilariCarp;
dlg += SayilariCikar;
|
myDelege isimli delegemden bir örnekleme yaptım adına da dlg dedim başlangıç fonksiyonuna da Toplama fonksiyonu olarak belirledi. 2 ve 3. satırlarda ise sırayla delegeme fonksiyonlarımı ekledim.
Aşağıda örnek kod ve çıktı mevcuttur.
Predicate Nedir ?
Predicate ise geri dönüş tipi olan bir fonksiyon yazabilmenizi sağlar örnek olarak elimizde bir sayı listesi var ve bu sayıların içinden çift olanları bulmanız gerekiyor. sayı listemiz aşağıdaki gibi verilsin.
1
| List<int> tumSayilar = new List<int>() { 2, 3, 12, 3, 41, 21, 4, 12, 3, 12, 4, 125, 123 };
|
Sayılarımızıın çift olup olmadığını kontrol eden bir adet fonksiyon yazıyoruz. Geri dönüş tipi bool olan bir fonksiyon.
1
2
3
4
5
6
7
8
9
| public static bool sayiCiftMi(int sayi)
{
if (sayi % 2 == 0)
{
return true;
}
else
return false;
}
|
Şimdi de Predicate'imizi oluşturalım aşağıdaki gibi.
1
| Predicate<int> predicate=new Predicate<int>(sayiCiftMi);
|
Predicate'imiz 'int' tipinde bir adet değişken alıyor ve geriye bool döndüren bir fonksiyonu refere ediyor şimdi bunu nerde kullancaz ? Hadi şimdi kullandığımız kısma gelelim
1
2
| List<int> ciftSayilar = new List<int>();
ciftSayilar = tumSayilar.FindAll(predicate);
|
Çift sayılar diye bir adet int tipinde liste oluşturuyorum. Daha sonra iste Listelerin class'ında bulunan findAll fonksiyonunu kullanıyorum bu fonksiyon benden bir Predicate istiyor aşağıdaki gibi
İstediğini de veriyorum benim Predicate'im çift sayıları bulan bir fonksiyonu işaret ediyor bundan dolayı TumSayilar'dan çift olanları
ciftSayilar adlı listemin içine atmış oluyorum.
Çift sayılar listesini de ekrana aşağıdaki komutla yazdırabiliyorum.
1
| ciftSayilar.ForEach(I => Console.WriteLine(I));
|
Burada I ile belirtilen ciftSayilar Listesindeki HER SAYIYA tekabül etmektedir. Çıktı da aşağıdaki gibidir.
Func Nedir ?
Bunu bilmeyen var mı gerçekten fonksiyondur işte . Öff sıkıcıyım tamam.
Şimdi öncelikle uzun olarak bir Func tanımlamasını daha sonra ise bunu daha ne kadar kısaltabiliriz onu göstereceğim. Func'lar bir T tipinde değişken alırlar ve T tipinde dönüş sağlarlar. Örnek olarak benim yazmış olduğum bu fonksiyon string tipinde bir değer döndürüyor aynı zamanda da string tipinde bir değer alıyor. İşlevi ise almış olduğu stringi büyük harflere çevirerek geri döndürüyor.
Fonksiyona bir bakalım.
1
2
3
4
| public static string FuncIcinYazdigimFonksiyon(string yazim)
{
return yazim.ToUpper();
}
|
Yukarıda fonksiyonu anlattım zaten şimdi de bu yazmış olduğum fonksiyonu bir Func içerisine atalım ve bunu kullanalım.
1
| Func<string, string> funcum = FuncIcinYazdigimFonksiyon;
|
Yazmış olduğum fonksiyonu funcum içine attım şimdi de örnek olarak metinler verelim ve bu metinleri ekrana Func ifadesini kullanarak yazdıralım.
1
2
| List<string> ornekYazilar = new List<string>() { "mer", "haba", "dunya", "cok", "klasik" };
ornekYazilar.ForEach(I => Console.WriteLine(funcum(I)));
|
Burada belirtilen
I değişkeni ornekYazilar listesindeki her bir stringi işaret etmektedir.
Şimdide gelelim Func daha kolay nasıl yazılır ?
1
| Func<string, string> ayniSey = f => f.ToUpper();
|
Evet, yukarıdaki yazilmiş olan fonksiyon FuncIcinYazdigimFonksiyon ile aynı şeyi yapmaktadır. Görmektesiniz ki Tek bir satır ile bir fonksiyon oluşturdum ve bu fonksiyona gelen string büyük harflere çevirip geri döndürdüm.
Son olarak da yukarıdaki her iki kodun da çıktısı aşağıdaki şekildedir.
Teşekkürler . Yavuz Selim K.
Yorumlar
Yorum Gönder