C# : Delegates (temsilciler)

c sharp 150x150 C# : Delegates (temsilciler) dot net c sharp 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 icon smile C# : Delegates (temsilciler) dot net c sharp

[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 icon smile C# : Delegates (temsilciler) dot net c sharp 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();
        }

    }
}

Not: Delegate isimlerinin sonuna Handler eklememin sebebi ; .NET kütüphanesinde tüm delegate lerin sonuna Handler takısı eklenmiştir, bir nevi gelenektir icon smile C# : Delegates (temsilciler) dot net c sharp
Bir dahaki yazıda görüşmek üzere inş. Hayırlı işler

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
6 yorum
  1. Uli says:

    Cok tesekurler! Giris derecesinde temiz ve gercekci anlatim. En son ornegin ciktisini verseydiniz guzel olurdu. Ayrica 29.satirdagi cokluTemsilci[1].DynamicInvoke(5, 2); yerine cokluTemsilci[1].DynamicInvoke(5, 4); verirsek sonuc

    Toplama işleminin sonucu: 7
    Toplama işleminin sonucu: 20

    olurmuydu?

  2. Nurullah says:

    29.Satırda çarpma metodu atanıyor. Bu yüzden çarpma işleminin sonucu 20 olacaktır.

  3. Hakan says:

    çok güzel olmuş. Faydalandım. Teşekkür ederim.
    Çalışmalarınızı devamını dilerim

  4. taner says:

    gerçekten çok iyi bir anlatım olmuş ,Teşekkürler.

  5. Murat says:

    çok iyi anlatım,
    Teşekkürler

  6. mehmet says:

    çok temiz anlatmışsın. ellerine sağlık

Yorum yaz

XHTML: Kullanabileceğiniz taglar : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>