C Sharp Delegate Kullanımı

  1. Insyder
    37
    930
    5.08.2018 00:08:00

    C# programlama dilinde delegate kullanımlarını araştırdığımda, örneklerde delegelerin fazladan iş yükü olduğunu gördüm. Tam olarak ne gibi durumlarda metod tutucu kullanılması gerekir?

    c# 1 yıl önce 3403 Görüntüleme

( 4 ) Cevap

  1. Snoopy
    36
    11571
    5.08.2018 01:22:00

    Bir delege (delegate) , bir metoda referansta bulunan bir nesnedir kabaca ve bir metodu encapsulation etmenin yöntemidir.Yani siz bir delege oluşturduğunuz vakit , bir metodun referansını tutan bir nesne oluşturuyorsunuz , tutucu tabiri de burdan geliyor sanırım Türkçemize.

    Biraz referans a deyinmek gerekirse , bir nesneye referans aslında o nesnenin bellekte ki adresidir.Her bir metodun bellekte fiziki olarak bir konumu vardır. İşte bu konum yada adres bir delegeye atanabilir ve artık bu metot bir delege ile çağrılabilir.

    Şimdi , senin fazladan iş yükü olarak gördüğün delege yi , ben başlıca büyük bir avantajıyla senin gözünde biraz yükselteyim :) . Hazırsan başlıyoruz , heyecanlı kısımlar başlıyor.

    Programın çalışması esnasında , delegenin referansta bulunduğu metodu değiştirmek sence nasıl olur ? Farklı bir metoda referans vermek , farklı bir metodu çağırabilmenin ta kendisi değil mi sence ? Sonuç ney peki , ne olacak ki böyle olunca ? Sonuç şu , aynı delegeyle , çalışma anında , dikkatinizi çekeyim derleme anında değil , çalışma anında/çalışma zamanında (runtime) çalışacak metodu belirleyebiliyorum /değiştirebiliyorum. İşte bu delegelerin bize sunduğu başlıca büyük bir avantaj.

    Bu gibi durumlarda kullanımına örnek verelim , bu saye de , ne gibi durumlarda kullanılır soruna da , ara ara cevap bulmuş oluruz.

    Forvetleri yöneten tek bir hocamız olsun futbol maçında , işte bu bizim delegate imiz olacak , hoca 3 tane komut verdiğini varsayalım maç esnasında , bunlar da işte metotlarımız olacak. Maç esnasında (program çalışma sırasında) , rakibin atağına göre (kullanıcının programda davranışına göre) , komutları hoca (metotları delegate) değiştirecek.

    delegate void ForvetYonet(string name);
    class Forvet
    {
        public static void DefansaGit(string name)
        {
            Console.WriteLine(name + " Defansa yardıma gel");
        }
        public static void HucumaDon(string name)
        {
            Console.WriteLine(name + " Yerime dön");
        }
        public static void OrtaSahayaGel(string name)
        {
            Console.WriteLine(name + " Orta sahada pas trafiğine dahil ol");
        }
        static void Main()
        {
            ForvetYonet forvetYonet = new ForvetYonet(DefansaGit);
            forvetYonet("Gomez");
            forvetYonet("Cenk");
            forvetYonet = new ForvetYonet(OrtaSahayaGel);
            forvetYonet("Cenk");
            forvetYonet("Dembaba");
            forvetYonet = new ForvetYonet(HucumaDon);
            forvetYonet("Gomez");
            Console.ReadLine();
        }
    }
    

    Csharp_delegate_kullanimi

    forvetYonet e ne zaman çağrılırsa , o anda hangi metoda referansı varsa , o metot çalıştırılır.Böylece hangi metodun çalışacağına derleme anında değil , çalışma anında karar verilmiş olur.

    > Daha anlaşılır olması açısından , diğer kullanım durumlarını ,bu soru altında farklı cevaplarda vereceğim.

    • Insyder İlginiz için çok teşekkür ederim. Diğer kullanım durumlarını müsait olduğunuz bir zaman yazarsanız çok memnun olurum. İyi geceler :)

    • Snoopy rica ederim ,tabi yazacağım diğerlerini de , iyi geceler :)

    • Yorum Ekleyin

  2. Snoopy
    35
    11571
    5.08.2018 12:55:00

    Delegenin bir başka heyecan veren kullanım durumu ise , çoklu çağrı (multicasting) dır.

    Çoklu çağrı kabaca , bir delegenin çağıracağı metotları , bir çağrı zinciri şeklinde tutabilmesi / oluşturabilmesidir.Zincire , += operatörü ile bir metot eklerken , -= ilede zincirden metot çıkartılır.

    Bu yöntemle oluşturduğumuz Delege Zincirleri güçlü bir yöntemdir / mekanizmadır ve bu mekanizmanın C sharp ta olaylar (events) ler ile beraber kullanıldığı bir kullanım durumu vardır , onuda müsait bir zamanda farklı bir cevapta yazmayı düşünüyorum.

    Şimdi bu kullanım durumuna bir örnek verelim , üstteki cevabımda ki uygulamayı , bu kullanım durumunda da kullanalım.Kodlara açıklamalar koydum onlar yeterli olur diye düşünüyorum;

    class Forvet
    {
        public static void DefansaGit(string name)
        {
            Console.WriteLine(name + " Defansa yardıma gel");
        }
    
        public static void HucumaDon(string name)
        {
            Console.WriteLine(name + " Yerine dön");
        }
    
        public static void OrtaSahayaGel(string name)
        {
            Console.WriteLine(name + " Orta sahada pas trafiğine dahil ol");
        }
        static void Main()
        {
            //Delegateleri oluşturmak
            ForvetYonet forvetYonet;
            ForvetYonet defansaGit = new ForvetYonet(DefansaGit);
            ForvetYonet hucumaDon = new ForvetYonet(HucumaDon);
            ForvetYonet ortaSahayaGel = new ForvetYonet(OrtaSahayaGel);
    
            //çoklu çağrı (multicasting) hazırlamak
            forvetYonet = DefansaGit;
            forvetYonet += HucumaDon;
    
            //çoklu çağrı (multicasting) hazırlamak
            //cenk multicasting zincir sırasi gereği önce defansa gidecek
            //sonra hücuma dönecek
            forvetYonet("Cenk");
    
            //çoklu çağrı (multicasting) de bazı metotları çıkarıp
            //zincire yeni metot ekleme
            forvetYonet -= DefansaGit;
            forvetYonet += OrtaSahayaGel;
            forvetYonet += HucumaDon;    
    
            forvetYonet("Cenk");
    
    
            Console.ReadLine();
        }
    
    }
    

    Bu mekanizmanın çıktısı da bu şekilde olacaktır ;

    Cenk Defansa yardıma gel

    Cenk Yerine dön

    ilk çağrı forvetYonet("Cenk");

    Cenk Yerine dön

    Cenk Orta sahada pas trafiğine dahil ol

    Cenk Yerine dön

    ikinci çağrı forvetYonet("Cenk");

  3. Snoopy
    33
    11571
    5.08.2018 14:45:00

    Delegelerin bir başka kullanımı durumu ise , delege üzerine kurulan ve C sharp ın bir başka güzel özelliği olan olaylardır(events). Kabaca olay(event) , bir etkinliğim, bir faaliyetin oluştuğunu / meydana geldiğini bildiren otomatik bildirge mekanizmasıdır.

    Bu mekanizma şöyle çalışır. Olayla ilgilenen event nesnesi , olayla ilgili olay yöneticilerini kayıt altına alır. Bir nevi bir olay olma durumuna karşı önceden yapılacak adımları belirler. Olay meydana geldiğin de ise , kayıt altında tuttuğu ne kadar olay yöneticisi(event handler) varsa hepsini çağırır.

    Hemen bir örnek yapalım daha iyi anlaşılması için , bir event nesnemiz üzerinden , bir olay meydana geldiği anda iki tane event handler çağıralım. Genelde Türkçe kaynaklarda olay yöneticileri çağrılırken , olayı ateşle tabiri kullanıldığından , benim de aklıma yangın olayı geldi gerçek hayattan , bu yüzden iki handlerımıda yangın söndürme araçları olarak seçtim

    delegate void TestEventHandler();
    // Olay Sınıfı.
    class EventTest
    {
        public event TestEventHandler SomeTestEvent;
        // Olayı ateşlemek.   
        public void OnSomeTestEvent()
        {
            SomeTestEvent?.Invoke();
        }
    }
    class EventTestDemo
    {
        // Olay(Event) Yöneticisi    
        static void Handler()
        {
            Console.WriteLine("İtfaiye Aracı Çağrıldı");
        }
        // Olay(Event) Yöneticisi    
        static void Handler2()
        {
            Console.WriteLine("Yangın Söndürme Helikopteri Çağrıldı");
        }
        public static void Main()
        {
            EventTest evt = new EventTest();
            // Handler() ı Olaylara (olay listesine/zincirine) ekle.      
            evt.SomeTestEvent += new TestEventHandler(Handler);
            // Handler2() yi Olaylara (olay listesine/zincirine) ekle.      
            evt.SomeTestEvent += new TestEventHandler(Handler2);
            // Olayı(Eventi) Ateşle.
            //!!!Acil durum :)
            //Tüm olay yöneticilerini çağır      
            evt.OnSomeTestEvent();
            Console.ReadLine();
        }
    } 
    

    delegate_ve_event_kullanimi

  4. Snoopy
    28
    11571
    5.08.2018 14:57:00

    Yukarıdaki 3 cevap silsilemizi toparlayacak olursak , yukardaki örnekler sadece kullanım durumlarına örnek. Yani aslında hep delegelerin nasıl yapıldığı na , kullanım durumlarına cevap.

    Peki delegelere neden ihtiyaç duyarız , delegeye neden gerek var sorularına da cevap vererek tamamlayalım.

    C sharp ta Delegelere başlıca iki nedenden ötürü başvurulur.

    1)Delegeler sayesinde çağrılacak metot derleme zamanın da değil de , çalışma zamanın da seçilir.

    2)Olaylar(events) , delegeler üzerine inşa edilerek kullanılır.

Cevabınız