eceyucel307
  C# : Delegates (temsilciler)
 

 C# : Delegates (temsilciler)
C# da bilinmesi gereken ayrı bir konu Delegateler yani temsilcilerdir. Delegateler metodları temsil eder.

Temsilcilerinin kullanılmasının amacı, belli olmayan metot çağrımlarını çalışma zamanında belirlemektir. Bildirimi aşağıdaki gibidir.

Delegate yapısı c++ dilindeki function pointerlara tekabül ediyor. Delegate konusu da interface gibi tek başına bir anlamlı bir konu değil, kafanızda bunu ben nerde niye kullanayım, bu ne işe yarar gibi sorularda kalıcak ama event yapısı ile birleşince olayı daha iyi pekiştirip anlayacaksınız inş. Event yapısınıda bir dahaki dökümanda yazacağım inş.

Delegate’in en kısa anlatımı şudur herhalde : Delegate’ler metodların bellekteki adreslerini aklında tutar.

[Erişim belirleyicisi] delegate [geri dönüş tipi] [delegate ismi] (parametreler);

public delegate int Topla(int s1,int s2);

Aşağıdaki kodu inceleyin.

using System;
  
namespace _Delegate
{
    class Program
    {
        public delegate int TemsilcimHandler(int sayi1,int sayi2);
  
        public static int Topla(int t1, int t2)
        {
            return t1 + t2;
        }
        public static int Carp(int c1,int c2)
        {
            return c1 * c2;
        }
  
        static void Main(string[] args)
        {
            int s1, s2;
            Console.Write("1. sayi : ");
            s1 = Convert.ToInt32(Console.ReadLine());
             Console.Write("2. sayi : ");
            s2 = Convert.ToInt32(Console.ReadLine());
  
            TemsilcimHandler temsilci ;
  
            temsilci = new TemsilcimHandler(Topla);
            Console.WriteLine("Topla metodu :" + temsilci(s1, s2));
  
            temsilci = new TemsilcimHandler(Carp);
            Console.WriteLine("Çarpım metodu : " + temsilci(s1, s2));
  
            Console.Read();
        }
  
 
    }

 

Programımızın amacı kullanıcıdan 2 sayı alıp bu iki sayının toplamını ve çarpımını vermek. Burada iki ayrı metod var Topla ve Carp isminde, geri dönüş tipleri int, aldıkları iki değer var.
Temscililerin yani delegatelerin metodları temsil ettiğini söylemiştik.
Temsilcim adında bir delegate oluşturduk, ardından Topla ve Carp metodlarını yazdık.

Dikkat ederseniz metod ile delegate yapı olarak aynıdır, aldıkları değerler, geri dönüş tipleri ve imzaları özdeştir. Eğer böyle yapmasaydık hata alırdık.
Buna açıklık getirmek için şöyle bir izahta yapabiliriz. Birşeyi ne temsil edebilir ? Tabii ki kendisine benzeyen birşey.

Şimdi gelelim programımızda ne yaptığımıza. Kullanıcıdan 2 sayı alıp bunları s1 ve s2 değişkenilerine atadık.
Ardından oluşturduğumuz temsilci isimli delegate’i kuruyoruz. Kurulumu sınıf kurmaktaktan hiçbir farkı yok. Yapıcı metod isterken dikkat edin;

delegate constructor C# : Delegates (temsilciler) dot net c sharp
Şeklinde istemektedir. Burada geri dönüş tipi int, aldığı iki parametrenin de int türünden olduğu gösterilmektedir. Buraya temsil edilecek metodu yazıyoruz. Daha sonra çağırmak istediğimizde de aşağıdaki şekilde kullanıyoruz.
temscilci(s1, s2);
Delegate kavramı zaten kendisine bildirilen metodu temsil ettiğine göre yukarıdaki şekilde temsil edilen metodu çağırıyoruz.

Çoklu Temsilciler

Temsilcimiz sadece bir metodu temsil etmeyebilir. Birden fazla metodu temsil etmesini de isteyebiliriz. Biz yukarıda temsilci nesnesini iki defa tanımladık, birini Topla metodu için diğerini ise Carp metodu için ama şimdi yapacağımız işlem ile her iki metodu aynı temsilci temsil edip, aynı anda çağıracak. Bu işlemi+= operatörü devreye girmektedir. += operatörü zorunluluk değildir, i+=1; gibi düşünün .Konuyu dağıtmadan örneğe geçmek istiyorum.

using System;
  
namespace _Delegate
{
    class Program
    {
  
        public delegate void TemsilcimHandler(int sayi1, int sayi2);
  
        public static void Topla(int t1, int t2)
        {
            Console.WriteLine("Toplama işleminin sonucu : {0}", t1 + t2);
        }
        public static void Carp(int c1, int c2)
        {
            Console.WriteLine("Çarpma işleminin sonucu : {0}", c1 * c2);
        }
  
        static void Main(string[] args)
        {
            temsilci;
            temsilci = new TemsilcimHandler(Topla);
            temsilci += new TemsilcimHandler(Carp);
            temsilci(3, 5);
  
            Console.Read();
        }
  
    }
}

Gördüğünüz gibi 23. satırda bahsettiğimiz işlemi gerçekleştirdik, += operatörünün yanında -+ operatürünü kullanarak önceden eklediğimiz bir metodu temsilciden çıkarabiliriz.
24. satırda ise her iki metodu aynı anda çağırdık. Ve ekran çıktısını aşağıdaki şekilde aldık.

Toplama işleminin sonucu : 8
Çarpma işleminin sonucu : 15

Ayrıca dizi şeklinde de tanımlayabilirdik ve istediğimiz metoda tek tek de ulaşabilirdik.Burada GetInvocationList ve DynamicInvoke araya girmektedir. Kullanımı oldukça basit aşağıdaki kod bloğunu inceleyiniz, gerekli yerlerde yorum satırları bulunmakta.

using System;
  
namespace _Delegate
{
    class Program
    {
  
        public delegate void TemsilcimHandler(int sayi1, int sayi2);
  
        public static void Topla(int t1, int t2)
        {
            Console.WriteLine("Toplama işleminin sonucu : {0}", t1 + t2);
        }
        public static void Carp(int c1, int c2)
        {
            Console.WriteLine("Çarpma işleminin sonucu : {0}", c1 * c2);
        }
        static void Main(string[] args)
        {
            TemsilcimHandler temsilci;
            temsilci = new TemsilcimHandler(Topla);
            temsilci += new TemsilcimHandler(Carp);
  
            //Delegate türünden bir dizi oluşturup, temsilci delegateini GetInvocationList ile buna atıyoruz.
            Delegate[] cokluTemsilci = temsilci.GetInvocationList();
  
            //Burada değer ataması yaptık, object[] parametre={5,2}; şeklinde bir diziyide bildirebilirdik.
            cokluTemsilci[0].DynamicInvoke(5, 2);
            cokluTemsilci[1].DynamicInvoke(5, 2);
            Console.Read();
        }
  
    }
 
}


 
 
  Bugün 14362 ziyaretçi (22500 klik) kişi burdaydı!  
 
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol