26 Eylül 2011 Pazartesi

C# Delegate Kullanimi


5 temel tipten biri olan delegelerin kullanım amaçları, metot adresi saklamaktır. Bazen metotlarımızı, ihtiyacımız olduğu anda çalıştırmak isteyebiliriz. Olay(event) tabanlı programlama ve asenkron programlama yaparken, anonim metot yazarken delegelerden faydalanırız. Bir diğer kullanım amacı da, bir metoda parametre olarak başka bir metot verebilmektir. Bu yazımızda temel olarak delegenin ne olduğununu, nasıl tanımlandığını, nasıl kullanıldığını ve nasıl bir mantıkla çalıştığını inceleyeceğiz.
Delegeler referans türlü bir tiptir. Dolayısı ile nesneleri heap’de durur. Girişte bahsettiğimiz gibi, görevleri metot adresi tutmaktır. Burada dikkat edilmesi gereken nokta; delegenin imzası, tuttuğu metodun imzası ile aynı olmalıdır. İmzadan kastımız, geriye dönüş tipi ve aldığı parametrelerdir. Bir delege, birden fazla metot adresi tutabilir. Bu durumda FIFO (ilk giren ilk çıkar) prensibi geçerlidir. Yani metotlar, delegeye bağlanma sırasına göre çalışırlar. Sonuç almak istediğimiz zaman, en son eklenen metodun yaptığı işi görürüz.
Şimdi basit bir örnek ile anlatmak istediklerimizi incelemeye çalışalım.
namespace DelegeKavrami
{
    delegate void Temsilci(); //Tanımladığımız bu delege, geriye dönüş tipi void olan ve parametre almayan metotların adreslerini saklayabilir.
   
    class Program
    {
        static void Main(string[] args)
        {
            Temsilci t = new Temsilci(Test);
            t.Invoke();
        }

        static void Test()
        {
            Console.WriteLine("Metot çalıştı");
        }
    }
}
İlk olarak, adresini tutacağımız metodun imzasına uygun bir delege tanımladık. Daha sonra Main metodu içerisinde, delege nesnemizi oluşturduk ve constructor metoduna parametre olarak metodumuzun adını verdik. t değişkeni üzerinden invoke metodunu çağırdımızıda da metodumuzu çalıştırmış olduk. (metodumuz parametre alsaydı, invoke metoduna parametre değerlerini vermemiz gerekecekti.)
Untitled

Şimdi de bir delegeye birden fazla metot bağladığımızda nasıl bir sonuç alacağımızı incelemeye çalışalım.
namespace DelegeKavrami
{
    delegate int Matematik(int x);
   
    class Program
    {
        static void Main(string[] args)
        {
            Matematik canta = new Matematik(KareAl);
            canta += new Matematik(KupAl);
            Console.WriteLine(canta.Invoke(5));
        }

        static int KareAl(int sayi)
        {
            return sayi * sayi;
        }

        static int KupAl(int sayi)
        {
            return sayi * sayi * sayi;
        }
    }
}
Yukarıdaki kod parçasını çalıştırdığımızda alacağımız sonuç aşağıdaki gibidir.
Untitled2
Delegemize iki metot bağlamamıza rağmen, invoke metodunu çağırdığımızda en son eklenen metodun çalıştığını gördük.
Son olarak yazım kolaylıklarından bahsedelim.
1) Bir delegeye += ile metot ekleyebildiğimiz gibi, –= ile de metot çıkartabilmemiz mümkündür.
Matematik canta = new Matematik(KareAl);
canta += new Matematik(KupAl);
canta -= new Matematik(KupAl);
Bu aşamada delegemizi invoke ettiğimizde KareAl metodu çalışacaktır.
2) Delege nesnesi oluştururken, new …(..) yazmayabiliriz.
Matematik canta = KareAl;
canta += KupAl;
Console.WriteLine(canta.Invoke(5));
3) canta değişkeni üzerinden invoke etmek yerine, bu değişkene direkt olarak parametreleri verebiliriz.
Matematik canta = new Matematik(KareAl);
int sonuc = canta(5);

Kaynak : http://onursalkaya.blogspot.com 
Share:

0 yorum:

Yorum Gönder

Blog Arşivi