16. Temsilciler (Delegates)

Delegateler fonksiyon tutan yapılardır. Örneğin 4 adet fonksiyonumuz olsun bunlar topla,cikar fonksiyonları olsun ve bunları tutacak metamatikselİslemler adında bir delegate’imiz olsun. Delegate tanımı şu şekilde olacaktır.

Parametre kısmına delegatein tutacağı parametrelerle aynı tipte ve aynı sayıda parametre verilmelidir.

  public delegate void matematikselİslemler(int param1,int param2);
  
  namespace ConsoleApp3
  {
    class Program
   {    //Bir delegate tanımlanır.
        public delegate void matematikselİslemler(int param1,int param2); 

     static void Main(string[] args)
     {
         //Delegate'e ait nesne üretilir ve nesneye parametre olarak temsil edilmesini istediğimiz metodu veririz.
         matematikselİslemler matematik = new matematikselİslemler(topla); 
      
         //Delegate'ler birden fazla fonksiyonu temsil edebilir.
         matematik += cikar; 

         //matematik -= cikar; metot eklenebildiği gibi çıkarabilir. 
         //Çıktısı "5+3=8 \n 5-3=2"  
         matematik(5, 3); 
        
         Console.ReadKey();
     }

     static void topla(int x,int y)
     {
        Console.WriteLine("{0} + {1} = {2}", x, y, x + y);
     }
     static void cikar(int x, int y)
     {
        Console.WriteLine("{0} + {1} = {2}", x, y, x - y);
     }
  
  }
}

Delegate’in tanımı ve kullanım şeklinden sonra asıl amacına gelelim. Delegate’in kullanım amacı fonksiyonları başka fonksiyonlara parametre olarak gönderebilmektir. Aşağıda ortalamaHesapla metodu kendisini temsil etmesi amacıyla bir delegate’e gönderilmiş ve bu delegate üzerinden başka bir fonksiyona parametre olarak gönderilmiştir.

 class Program
 {   
     //delegate tanımı ; dönüş tipi ve parametre tip ve sayısı tutacağı fonksiyonla eşleşmeli.
     public delegate double hesapla(int param1, int param2); 

     static void Main(string[] args)
    {
     //delegate'a ait bir nesne ve parametre olarak tutacağı fonksiyon.
      hesapla hesapYap = new hesapla(ortalamaHesapla);

      //hesapYap delegate'i üzerinden ortalamaHesapla fonksiyonunu harfNotuHesapla fonksiyonuna parametre olarak gönderdik.
      harfNotuHesapla(85, 80, hesapYap); 

      Console.ReadKey();
    }
  
      //fonksiyon parametre olarak iki adet integer'a ilaveten bir de delegate üzerinden ortalamaHesapla fonksiyonunu alıyor. 
      static void harfNotuHesapla(int sin1,int sin2,hesapla h) { 

       string harfNotu = "";
   
       //Kıyaslamalar delegate'e ait fonksiyonun döndüreceği değer üzerinden yapılır
        if (h(sin1, sin2) >= 90) 
          harfNotu = "aa";
        else if (h(sin1, sin2) >= 80)
          harfNotu = "ba";
        else
          harfNotu = "ff";

       Console.WriteLine("ogrencinin harf notu {0}", harfNotu);

    }
   
     //önce delegate'e oradan da diğer fonksiyona parametre olarak gönderilen fonksiyon
     static double ortalamaHesapla(int sinav1, int sinav2)
     {

        double ortalama = (sinav1 + sinav2) / 2;
 
        return ortalama;
     }
 
 }