c# Delegate nedir?

Delegeler methodların referanslarını tutan tiplerdir. Böyle söyleyince çok anlamlı olmuyor, değil mi? Bunu anlatmak için örnek kullanmak daha iyi olacak sanırım.

Öncelikle Şöyle bir delege tanımı yapalım;

        int a = 0;
        public delegate int mydelegate(int i1, int i2);

delegate tanımımız hazır. Şimdi de methodlarımızı oluşturalım. Kolay şeyler olsun. Birisi iki sayıyı çarpsın, diğeri toplasın;

        public int topla(int x, int y)
        {
            a = a + 1;
            return x + y;
        }
        public int carp(int x, int y)
        {
            a = a * 3;
            return x * y;
        }

Not  : a değişkenini ve methodlar içindeki kullanımını lütfen şimdilik kafamıza takmayalım. Şimdilik onlar yokmuş gibi düşünelim. a değişkenini bir sonraki örnekte kullanacağız.

Burada dikkat edilmesi gereken en önemli unsur, tanımladığımız methodların return değerleri ve girilen parametrelerin sayısı, sırası ve tipleri aynı olmalıdır. Dikkat ederseniz delege tanımımızın return tipi int, tanımladığımız metodların da öyle, yine dikkat ederseniz delegate tanımımız 2 adet int parametre alıyor, metodlarımız da öyle.

Şimdi delegeyi bir butonun onclick eventında nasıl kullandığımıza bakalım. Şimdilik ben tanımladığımız metodlardan topla metodunu kullanacağım.

        private void button1_Click(object sender, EventArgs e)
        {
            mydelegate d = new mydelegate(topla);
            MessageBox.Show(d(3,4).ToString());
        }

MessageBox bize popup olarak 7 değerini verecektir.

Şimdi madem kullanmayacaktık carpma metodunu niye tanımladık öyle değilmi? Delegeler sadece tek metodu refere etmek zorunda değildirler. Aynı anda 1 den fazla method refere edilebilir. Aşağıda yine örnek ile anlatmaya çalışalım. Bu örneğimizde a değişken tanımımızı da kullancağız.

        private void button1_Click(object sender, EventArgs e)
        {
            mydelegate d = new mydelegate(topla);
            d += carp;
            MessageBox.Show(d(3,4).ToString());
            MessageBox.Show(a.ToString());
        }

Butona basıldığında d delegemizin sadece çarma işlemini yaparak ilk çıkacak messageboxta 12  değerini verdiğini göreceksiniz. Fakat 2. messagebox bize 3 değerini gösterecek.

Demekki neymiş aslında delegeye tanımladığımız 2 metodumuz da çalışmış. Delegeye yeni bir methot eklemek istediğimizde gördüğünüz gibi += operatorunu kullandık. Bu size birşey hatırlatıyor mu? Genelde bir butonun örneğin oncilick eventına ekleme yaparken de bu operatörü kullanıyoruz değil mi? Evet. Çünkü eventlar da aslında delege tanımlarıdır.

Delegelerde birden fazla method ekleyebildiğimizi gördük. Bu metodları -= operatörü kullanarak çıkarabilirizde.

Aşağıda bu konu ile ilgili de örneğimiz var. Bunu deneyerek çıktılarını tahmin etmeye çalışın. Bakalım doğru tahmin edebilecek misiniz?

        private void button1_Click(object sender, EventArgs e)
        {
            mydelegate d = new mydelegate(topla);
            d += carp;
            d -= topla;
            d += topla;
            MessageBox.Show(d(3,4).ToString());
            MessageBox.Show(a.ToString());
        }

Sizce bu kodun çıktısı nedir?