01/12/2015 12

C# ile Delegate - Temsilci Kullanımı

Herkese merhaba bu yazıda sizelre C# ile Delegate nesnesinin kullanımını anlatacağım. Bu nesneler aracılığı ile programlarımızı daha verimli hale getireceğiz.

C# içerisindeki delegate nesnesi C ve C++ içerisindeki pointer fonksiyonları ile çok beznerdir. Dışarıdan metodları çağırmak ve metodlara callback yapmak için kullanılan sınıftır. Bunu kullanabilmek için System.Delegate isim uzayının kütüphaneler alanına eklenmiş olması gerekmektedir.


using System.Delegate;

Delegate Nesnelerini Tanımlama

Delegate tanımlama bir metodu bir referansa bağlama anlamına gelir yani bir delegate ir metodu temsil eder.  Yani metodu çağırmak için bu nesnelerin imzası kullanılır diyebiliriz. Delegate nesnesini çağırdığımızda referansı olduğu metod çalışır.

Aşağıda örnek bir delegate nesnesi tanımlanmıştır.


delegate int delegate_nesnesi(string deger);

Yukarıda gördüğümüz üzere int olarak tanımlanan delegate nesnemizin içerisine bir string ifade gönderiyoruz. Ve delegate nesnemizde bize geri int değer döndürüyor.O zaman aşağıdaki şekildeki gibi delegate nesnelerimizi tanımlıyoruz diyebiliriz.


delegate değişken_türü delegate_adı fonksiyon_parametreleri

Delegate nasıl başlatılır ?

Delegate nesnesi başlatılmadan önce, new anahtar kelimesi ile tanımlanmış olmalıdır ve birlikte çalışacağı fonksiyon parçacığı ile ilişkilendirilmelidir. Bir delegate nesnesi oluşturulurken, bundan sonra oluşturulan değişkenler yeni oluşturulacak olan fonksiyona giderler, fakat fonksiyonsuz bir şekilde geçerler. iraz karışık oldu değilmi ama aşağıdaki örneklere bakarak daha iyi anlayalım. Aşağıda sadece fonksiyonu oluşturduk ve degerleri gönderdik.

public delegate void yazdir(string deger);

yazdir fonk1 = new yazdir(arttirYaz);
yazdir fonk2 = new yazdir(azaltYaz);
Aşağıdaki örnekte ise delegate nesnesini tanımlamayı oluşturmayı ve çalıştırmayı görelim. Çalışan delegate nesnesinin içerisine değişken gönderelim ve bize geri değer döndürsün. İnteger değer gönderelim ve geriye integer değer döndürsün.

using System;

delegate int temsilcim(int deger);
namespace delegate_uygulama
{
   class delegate_calismasi
   {
      static int sayi = 33;
      public static int sayi_arttir(int girilen)
      {
         sayi += girilen;
         return sayi;
      }

     public static int carp(int girilen)
     {
         sayi *= girilen;
         return sayi;
     }
      public static int sayi_getir()
      {
         return sayi;
      }

      static void Main(string[] args)
      {

         temsilcim d1 =newtemsilcim(sayi_arttir); //gördüğümüz gibi değişkenleri buraya girmedik. yukarıda karışık olabilir diye belirttiğim yer burasıydı
         temsilcim d2=new temsilcim(carp); //delegate nesnelerimizi oluşturmuş olduk tekrar söyleyeyim fonksiyonların içerisine gönderdiğimiz değişken değerlerini buraya yazmadık.

         d1(10); // fonksiyonun değişken değerini buradan göndermiş olduk
         Console.WriteLine("Sonuc :" + sayi_getir());
         d1(2);
         Console.WriteLine("Sonuc :" + sayi_getir());
         Console.ReadLine();
      }
   }
}

Yukarıdaki programı çalıştırdığımızda programın çıktısı aşağıdaki gibi olacaktır.

Sonuc : 43
Sonuc : 86

Delegate nesnesini çoklama işlemi

Delegate nesneleri + işareti ile birleştirilebilir. Birleştirilmiş olan delegate nesnesi çağrılan fonksiyonları birleştirilmiş şekilde çağırır. Sadece aynı türden olan delegate nesneleri birleştirilebir. Yani int ile int string ile string bool ile bool vs. delegate neslneleri birleştirilebilir. - işareti ise birleştirilmiş olan delegate nesnesinden bileşen çıkarmak ayrıştırmak için kullanılır.

Bazen yazılım içerisindeki isteme işlemlerinde çoklama veya azlama işlemleri kullanılabilir.Buna terimsel olarak multicasing denir. Aşağıda buna bir örnek yapalım.


using System;

delegate int delegate_nesnem(int n);
namespace delegate_deneme
{
   class delegate
   {
      static int sayi =10;
      public static int sayi_ekle(int> deger)
      {
         sayi += deger;
         return sayi;
      }

      public static int carp(int deger)
      {
         sayi *= deger;
         return sayi;
      }

      public static int sayi_getir()
      {
         return sayi;
      }

      static void Main(string[] args)
      {
         //delegate nesneerimizi oluşturuyoruz
         delegate_nesnem d;
         delegate_nesnem d1 = new delegate_nesnem(sayi_ekle);
         delegate_nesnem d2 = new NumberChanger(carp);
         d = d1;
         d += d2;

         //yukarıda çoklama işlemi yapıyoruz
        //çoklama işlemindne osnra fonksiyonu çağırıyoruz
         d1(5);
         Console.WriteLine("Sonuc : " + sayi_getir());
         Console.ReadLine();

        //yapılan işlem ilk olarak 10 sayısına 5 ekledi
         //daha sonrada eklenince ortaya çıkan sayıyı 5 ile çarptık
         //yani iki fonksiyonada aynı değişken değerini göndererek işlem yaptırdk.
      }
   }
}
Yukarıdaki programın çıktısı aşağıdaki gibi olacaktır. İlk olarak ekleme işlemi yapıldı. sonuc olarak 15 oldu. Daha sonra 15 sayısını 5 ile çarptık ve ardından 75 sayısını elde ettik.

Sonuc : 75

Delegate Kullanım Örneği

Aşağıda bir tane daha delegate kullanım örneği yapalım.

Aşağıdaki metodların kullanımı inceleyip öğrenelim ve yazımızı tamamlayalım arkadaşlar...


using System;
using System.IO;

namespace delegate_program
{
  ekrana_yazdir
   {
      static FileStream fs;
      static StreamWriter sw;

      // delegate nesnemizi tanımlıyoruz
     public delegate void yazdir(string veri);

      //Console ekranına yazdırmak için kullanılan fonksiyon
      public static void ekrana_yazdir(string veri)
      {
         Console.WriteLine("Sonuc : " + veri);
      }

      //bir dosyaya yazdırmak için kullanılan fonksiyonumuz
      public static void dosyaya_yaz(string veri)
      {
         fs = new FileStream ( "c:/dosya.txt" ,
         FileMode.Append,FileAccess.Write);
         sw = new StreamWriter(fs);
         sw.>WriteLine(s);
         sw.Flush();
         sw.Close();
         fs.Close();
      }


      public static void yazi_gonder(yazdir yaz)
      {
         yaz("TheCodeProgram");
      }
      static void Main(string[] args)
      {
         yazdir y1=new yazdir(ekrana_yazdir);
         yazdir y2 = new yazdir(dosyaya_yaz);
         yazi_gonder(y1);
         yazi_gonder(y2);
         Console.ReadLine();
      }
   }
}
Yukarıdaki programı çalıştırınca programın çıktısı aşağıdaki gibi olacaktır.

Sonuc : TheCodeProgram

Bu şekilde delegate tanımlamış başlatmış ve çalıştırmış olduk. Çalıştırılan bu delegate nesnesi ile iki farklı fonksiyonu çağırıp kullanmış olduk. Delegate nesnemizi programımızı hızlandırmak ve aynı fonksiyonu aynı anda daha hızlı bir şekilde çağırıp kullanmış olduk.

Bu yazımızda bu kadar -- Takipte Kalın

Burak Hamdi TUFAN

İyi Çalışmalar


Tags

Share this Post



Post a Comment

Success! Your comment sent to post. It will be showed after confirmation.
Error! There was an error sending your comment.

Comments

    There is no comment. Be the owner of first comment...