Ana içeriğe atla

( C#) Ders 8 - C# da Delegate Tanimlama ve Kullanimi

C# da Delegate Tanimlama ve Kullanimi

Delegate’ler bir metodun referansi olarak kullanilirlar. Önceki derslerimizde nesneler için referans kullanimi ile ilgili bilgiler vermistik, Örn: Personel p = new Personel(); bu örnekteki p Personel tipindeki bir nesnenin referansidir.
Delegateler de nesne referanslarina benzerler, fakat aradaki temel fark bir nesneye degil metoda referans etmeleridir.
Not: Delagateler C++ da kullanilan fonksiyon pointerlarina benzerler.
delegate in C#
Delegate kullanmadan önce,delegate’in isaret edecegi metoda ait tip(type) ve imza(signature) bilgilerine ihtiyacimiz vardir. Bir metoda ait signature bilgisi metodun dönüs tipini ve aldigim parametre tiplerini barindirir.
Örnegin Sikça kullanilan Main metodu ve signature tanimlamasi asagidaki gibidir ;
?
1
2
3
4
5
6
int Main(string [] args)
{
   
}
//Signature tanimlamasi:
int herhangibirMetodAdi(string[] args)
Main metodu disinda tanimladigimiz bir metoda ait signature bilgileri de asagidaki gibi olur.
?
1
2
3
4
5
6
int Topla(int a, int b)
{
     return a+b;
}
//Yukaridaki metot için signature tanimlamasini asagidaki gibi yapabiliriz.
int matematikselMetot(int p, int q)
Ayrica yukaridaki signature tanimlamasi ayni zamanda asagidaki metot içinde signature tanimlamasi olabilir.
?
1
2
3
4
int Cikar(int a, int b)
{
    return a-b;
}
Yukaridaki Örneklerde signature tanimlamasindaki metot adi ve parametre adlarinin önemli olmadigini anlamissinizdir. Sadece dönüs tipi ve parametre tiplerinin ayni olmasi yeterlidir.
Delegate tanimlamasi yaparken signature bilgisinin önüne delegate kelimesini eklememiz yeterlidir.
?
1
delegate int YeniDelegate(int p, int q);
Yukaridaki delegate 2 adet int tipinde parametre alan ve int bir deger döndüren herhangi bir metot için referans olarak kullanilabilir.
Tanimladigimiz delegate için siniflar için olusturdugumuz gibi asagidaki gibi bir referans nesne olusturmamiz gerekir.
?
1
YeniDelegate matematikselMetotlar;
Yukaridaki tanimladigimiz matematikselMetotlar’i artik ayni signature bilgisine sahip tüm metotlar için kullanabiliriz. Bunun için asagidaki kod blogunu kullaniriz.
?
1
matematikselMetotlar =  new YeniDelegate(Ekke);
Siniflar için nesne olustururken gibi yukaridaki örnekleri asagidaki gibi kisaca yazabiliriz.
?
1
YeniDelegate  matematikselMetotlar =  new YeniDelegate(Ekke);

Delegate üzerinden Metotu Çagirmak.

Yukaridaki örnegimizde delegatemizi Ekle fonksiyonuna isaret ettirdigimize göre artik delegate üzerinden metodumuzu asagidaki gibi çagirabiliriz.
?
1
int r = matematikselMetotlar(4,5);
Yukaridaki anlattiklarimiz toparlayacak olursak asagidaki gibi bir kodumuz olusur.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
namespace YazilimMutfagiCSharpDersleri
{
    class Test
    {
        delegate int OrnekDelegate(int a, int b);
 
        static void main()
        {
            OrnekDelegate aritmetikMetodlar = new OrnekDelegate(Topla);
            int r = aritmetikMetodlar(2, 5);
            Console.WriteLine("2 + 5 = {0}", r);
        }
        static int Topla(int a, int b)
        {
            return a + b;
        }
 
    }
}

Multicast Delegate Tanimlamak

Multicast delegateler yukaridaki örnegimizin aksine ayni anda birden fazla metodu isaret edebilir. Isaret edecegi metodlarin signature’lari ayni olmak zorundadir. Yukaridaki örnegimizi genisletecek olursan OrnekDelegate ismi ile tanimladigimiz delegateimiz hem Topla hemde Cikar fonksiyonlarina ayni anda isaret ederek tek bir seferde ile ikisini birden çagirabilir. Asagidaki örnegimiz de göreceginiz gibi += ile delegate’e yeni metot eklerken -= ilede daha önce ekledigimiz metodu çikarabiliriz. Kodlarimiz yeni hali asagidaki gibi olur;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
 
namespace YazilimMutfagiCSharpDersleri
{
    class Test
    {
        delegate void OrnekDelegate(int a, int b);
 
        static void main()
        {
            OrnekDelegate aritmetikMetodlar;
 
            aritmetikMetodlar  = new OrnekDelegate(Topla);
            aritmetikMetodlar += new OrnekDelegate(Cikar);
             
            aritmetikMetodlar(2, 5);
 
            aritmetikMetodlar -= new OrnekDelegate(Topla);
 
            aritmetikMetodlar(3, 9);
             
        }
        static void Topla(int a, int b)
        {
            Console.WriteLine("a + b = {0}", a + b);
             
        }
        static void Cikar(int a, int b)
        {
            Console.WriteLine("a - b = {0}", a - b);
        }
    }
}

Yorumlar

Bu blogdaki popüler yayınlar

Linux En Az Sistem Gereksinimi İsteyen Dağıtımları Değerlendirilmesi

Linux İşletim Sisteminin Dağıtımlarının En az sistem gereksinimi isteyen sürümleri, değerlendirilmesi aşağıdadır, Değerlendirilen dağıtımlar şunlardır: Ubuntu Xubuntu Lubuntu Damn Small Linux Linux Mint Fedora Opensuse Debian Rat Hat Suse Linux Suse Linux Sistem Gereksinimleri: Pentium 1-4 ya da Xeon; AMD Duron, Athlon (XP, MP ya da 64), Sempron ya da Opteron 256MB RAM 500MB boş disk alanı 800x600 yada üstü resolution Rat Hat Memory Gerekli: 4 GB of memory Önerilen: 8 GB of memory CPU Gerekli: Intel Core processor, 2.4GHz, 512K cache or equivalent Önerilen: Intel multi-core processor, 2.4GHz dual processor, 512K cache or equivalent Storage 5 GB alan temel kurulum için. 40 GB alan Channel başına. 10 GB alan Cache dizini için(/var/cache/rhn) Disk yapılandırması olarak Raid 5 tavsiye edilir. Database İlk kurulum için 12 GB alan önerilir. Client ve channel hesaplamaları ise, 250 KB alan client system başına, 500 KB alan çhannel başına, ayrıca 230 KB channel da...

( C#) Ders 4 - Diziler, Çok Boyutlu Diziler, Düzenli ve Düzensiz Çok Boyutlu Diziler Nasil Kullanilir. foreach Döngüsünün Kullanimi.

C# da Diziler Diziler için ayni tipteki verilerin tutuldugu bir koleksiyon diyebiliriz. Örnegin integer verinin bir yigin seklinde tutulmasi için dizileri kullaniriz. C# da diziler referans tipinde degiskenlerdendir. C# da tanimlanan tüm diziler System.Array sinifindan türemis bir nesnedir. C# da diziler asagidaki gibi tanimlanir. ? 1 <veri tipi>[] <degisken ismi> = new <veri tipi>[<dizinin boyutu>]; 10 adet integer veri tutan bir dizinin tanim ise ? 1 int [] integerDizi = new int [10]; Bir dizinin boyutlari sabittir ve kullanilmadan önce belirlenmelidir. Dizi boyutunu belirlemek için baska bir degiskende kullanabilirsiniz. ? 1 2 int boyut = 10; int [] integerDizi = new int [boyut]; Diziyi tanimlama ve baslangiç degerlerini atama islemini ayri satirlardada yapabilirsiniz. ? 1 2 int [] integerDizi; integerDizi = new int [10]; Ayrica dizileri tanimlarken, dizi içine atmak istedigin...

(C#) Ders 2 - Degisken Tipleri, Degisken Tanimlama ve Operatörler

C# Hakkinda Temel Bilgiler Bu dersimizde C# dili hakkinda temel bilgiler ögrenecegiz. Biraz açarsak bu dersimizde veri tipleri, degiskenler ve operatörleri nasil kullanacagimizla ilgili bilgiler verecegiz. Temel Veri Tipleri ve CTS(Common Type System) Karsiliklari C# da iki çesit veri tipi vardir: Deger Tipleri (Value type) Referans Tipleri(Reference Type) Degiskenler bellekte bulunan verilerdir. Bir degiskeni kullandigimiz zaman o degiskenin bellekte bulundu yerdeki bilgiyi kullaniriz. Deger tipleri veriyi direk olarak bellek bölgesinden alirken referans tipleri baska bir nesneye referans gösterirler. Yani referans tipleri içinde veri degil adres bilgisi tutarlar. Veri tipleri stack dedigimiz bellek bölgesinde tutulurlar, referans tipleri ise heap bellek bölgesinde saklanirlar. int, double, float gibi veri tipleri deger tiplerine örnek gösterilebilir. Herhangi bir sinif türü ise referans tipine örnek gösterilebilir. Deger tipleri birbirine esitlenirken degiskenin ba...