Uzmanına Sor

VISUAL C# – DELEGATES AND EVENTS – PART I: Delegates

without comments

Bugunku makalemizde sizlerle Temsilciler (Delegates) hakkinda incelemede bulunup, ornek yapacagiz. Temsilciler (Delegates) her ne kadar ileri derece bir kavram olsada her seviyeden C# ile ugrasan kisilerin bilmesi gereken bir yapidir. Tabii ki Delegates kullanmadan bir projeyi yapabilirsiniz. Fakat o zaman yapamayacaginiz isler, yapabilecekleriniz onune gecer.

Delegates bir projede bir veya birden fazla methodu gosteren bir referans turunden bir nesnedir. Delegates’i kullanamaya baslamadan once tipki bir method tannimlar gibi, delegate’imizin tanimlamasini yapariz. Delegates 2 islem arasinda anahtar gorevi gorur.

image (C-Sharp Nedir’den alintidir)

 

Delegates’i size anlatmak icin kullanacagim ornektenten biraz bahsedeyim. Gunluk yasantimizda Delegates’in yaptigi ise verebilecegim en iyi ornek, Lamba ve Lambayi calistiran Dugmedir. Dugme, lambanin yanmasini tetikleyen bir anahtardir(aradaki kablo vasitasi ile). Bunu ornegimizde daha iyi anlayabiliriz. Ornegimize baslarken Ampul ve Dugme’ icin Class yazalim.

Ampul Class’i :

public class Ampul
    {
        private string Marka_;
        public string Marka
        {
            get { return this.Marka_; }
            set { this.Marka_ = value; }
        }

        public Ampul(string AmpulMarka)
        {
            this.Marka_ = AmpulMarka;
        }

        public void BagliBulundugumDugmeyeBasildi(DugmeDurumu Sinyal)
        {
            if (Sinyal == DugmeDurumu.Acik)
            {
                System.Windows.Forms.MessageBox.Show(this.Marka_ + " ampülü yanıyor !");
            }
            else if (Sinyal == DugmeDurumu.Kapali)
            {
                System.Windows.Forms.MessageBox.Show(this.Marka_ + " ampülü yanmıyor !");
            }
        }
    }

Dugme Class’i:

public class Dugme
    {

        public event KabloDelegate SinyalGeldi;

        private DugmeDurumu DugmeninAnlikDurumu_ = DugmeDurumu.Kapali;

        public DugmeDurumu DugmeninAnlikDurumu
        {
            get { return this.DugmeninAnlikDurumu_; }
        }

        private KabloDelegate DugmeBaglantiKablosu = null;

        public void AcKapat()
        {
            if (this.DugmeninAnlikDurumu_ == DugmeDurumu.Kapali)
            {
                this.DugmeninAnlikDurumu_ = DugmeDurumu.Acik;
            }
            else
            {
                this.DugmeninAnlikDurumu_ = DugmeDurumu.Kapali;
            }

            if (SinyalGeldi != null) SinyalGeldi(this.DugmeninAnlikDurumu_);
        }
    }

Dugme durumunu belirtmek icin Enum kullanalim:

 public enum DugmeDurumu
    {
        Acik,
        Kapali
    }

 

public void AcKapat()
        {
            if (this.DugmeninAnlikDurumu_ == DugmeDurumu.Kapali)
            {
                this.DugmeninAnlikDurumu_ = DugmeDurumu.Acik;
            }
            else
            {
                this.DugmeninAnlikDurumu_ = DugmeDurumu.Kapali;
            }

            if (SinyalGeldi != null) SinyalGeldi(this.DugmeninAnlikDurumu_);
        }

Ve en onemlisi anahtar gorevi gorecek olan Delegate’imizi tanimlayalim:

public delegate void KabloDelegate(DugmeDurumu dgm);

 

Simdide sira FormLoad’a yazilacak kodlarda:

private void SerkanHekimogluDelegates_Load(object sender, EventArgs e)
        {
            Ampul amp = new Ampul("Birinci Ampul");
            Ampul amp2 = new Ampul("Ikinci Ampul");

            Dugme dgm = new Dugme();

            dgm.SinyalGeldi += new KabloDelegate(amp.BagliBulundugumDugmeyeBasildi);
            dgm.SinyalGeldi += new KabloDelegate(amp2.BagliBulundugumDugmeyeBasildi);

            dgm.AcKapat();
        }

 

Formumuzu Run ettigimizde, Form Load’a koydugumuz Temsilcilerimizin, tanimlamis oldugu Joblari yaptigini goreceksinizdir.

 

Eventler hakkinda bilgiyi ve ornegi ikinci makalemizde yapacagiz.

 

 

 

Written by Serkan Hekimoğlu

January 18th, 2010 at 11:21 am

Posted in .NET, C#

Tagged with , , ,

Leave a Reply