C#'ta Temsilci (delegate) ve Olay (event) Kavramı

Eyl 06, 2013
  • Temsilci (Delegate) Kavramı

    C# dilinde temsilciler ileri seviye bir konudur. Ama her seviyeden program geliştiricisi kullanabilir. Programlar temsilciler olmadan da yazılabilir, fakat temsilcilerin işlevselliğinden ve sağladığı kolaylıklardan yararlanılamaz.

    Temsilciler c# programlama dilinde bir ve ya birden çok metodu gösteren referans türünden nesnelerdir. Metodlarla aynı şekilde tanımlanırlar. Bir temsilci tanımlandıktan sonra bir veya birden çok metod temsilciye atanarak kullanılır. Temsilciler genelde çok sayıda metoda atanarak kullanılır ki, sağladığı avantajlar da burada ortaya çıkar. 
    Aşağıda gösterildiği gibi tanımlanıp, metodlara atanırlar.

    // Temsilci Tanımlandı.
    public delegate void Temsilci();

    public static void Metod()
    {       }

    // Temsilci türünden yeni nesne yaratılıp Metod adlı metoda atandı.

    Temsilci Atama = new Temsilci(Metod);

  • Olay (Event) Kavramı

    Olaylar, nesne yönelimli programlama ortamlarında devamlı olarak kullanılırlar. Burada en çok bilinen örnek, Button (düğme) sınıfına ait olan bir nesne için Click (tıklama) isimli eventdir. Click eventinde fareyle button nesnesinin üzerine tıklandığında ortama bir olay fırlatılır. Ayrıca, olaylar veritabanındakiTrigger(tetikleyici)‘lar gibi düşünülebilir. Olaylar program içinde gerekli şartlar sağlandığında kendiliğinden gerçekleşirler. Çağırılmalarına gerek yoktur. Metodlardan bu noktada farklıdırlar.

    Olaylar kullanılacağı zaman bunu gerçekleştirmek için temsilcilere başvurulur. Olaylar temsilci türünden yaratılarak ortama fırlatılabilir.

    Basit anlamda aşağıdaki gibi tanımlanırlar.

    public delegate void Temsilci(); 

    public event Temsilci Olay; // Event delegate türünden yaratılır.
     

Uygulama

Uygulamada hazırlanacak olan program, hızı düzenli aralıkda yükselen bir otomobilin hızı 80’i aştığında uyarı almasına yarar. Bunu gerçekleştirebilmek için, bir olay yaratarak hız 80’i aştığında ortama fırlatılmasını sağlamak gerekir. 

Uygulama’da ilk olarak Otomobil ve HizArgs adında birer sınıf oluşturulur.

namespace HızAsmaUyari

{
    enum ArabaModel

        {

            kamyonet,
            minibus,
            otomobil,
            ticariarac

        };

    // Olay atanacak olan Temsilci tanımlandı.

    public delegate void HizHandler (object sender, HizArgs arg );
    public class HizArgs
    {

        private int guncelHiz;
        public DateTime Zaman

        {
            get { return DateTime.Now; }
        }
        public int GuncelHiz

        {
            get { return guncelHiz; }
        }

        public HizArgs(int guncelHizi)

        {
            guncelHiz = guncelHizi;
        }

    }

    class Otomobil

    {

        private int hiz;
        private ArabaModel model;
        public event HizHandler HizAsildi;   // Event oluşturuldu.
        public ArabaModel Model

        {
            get { return model; }
            set { model = value; }
        }

        public int Hiz
        {
            get { return hiz; }
            set
            {

                if (hiz >= 80 && HizAsildi != null)
                    HizAsildi(this, new HizArgs(value));
                hiz = value;
            }
        }
    }
}

Otomobil sınıfının içinde tanımlanan event gerçekleştiğinde yapılacak atamalar için HizAsildiEventArgs adında bir sınıf oluşturulur.

namespace HızAsmaUyari

{

    class HizAsildiEventArgs:EventArgs

    {

        private int guncelSurat;
        public int GuncelSurat

        {

            get { return guncelSurat; }
            set { guncelSurat = value; }

        }

        public HizAsildiEventArgs(int gSurat)
        {
            guncelSurat=gSurat;
        }
    }
}

Bu işlem de tamamlandıktan sonra, Program sınıfı oluşturulabilir.

namespace HızAsmaUyari

{

    class Program

    {

       static void Main()

        {
            Otomobil arabam = new Otomobil();
            arabam.HizAsildi += new HizHandler(arabam_HizAsildi);
            for (int i = 70; i <= 90; i+=5)

            {

                arabam.Hiz = i;
                Console.WriteLine("Hızımız, {0} ",arabam.Hiz);
                Thread.Sleep(1000);

            }
        }

        static void arabam_HizAsildi(object sender, HizArgs arg)

        {
            Console.Write("Hız sınırı aşıldı..." + arg.Zaman + ". ");
        }
   }
}

Oluşturulan son sınıftan sonra programın vereceği ekran görüntüsü aşağıdaki gibidir.