C# delegate (Delege veya Temsilci) Kavramı

16 Ara

Bu yazımızda C# programlama dilini öğreneneler için bazen işkence haline dönüşen ve bir .Net kavramı olan delegeler üzerinde duracağız. Delegeler, adından da anlaşılacağı üzere temsilcidirler. Temsil ettikleri kavram ise metodlardır.

Delegelerin hangi tür değerleri dönrüren ve ne tür parametre alan metodları temsil ettiklerini tanımlanırken belirleriz.

Bir delegenin tanımlanış şekli aşağıdaki gibidir.

Örnek delege:

<erişim belirleyici> delegate <geri dönüş tipi> <delege adı>(<parametreler>)

 public delegate int Hesaplayici(int a,int b);

Örnek delegemizin tanımlanış biçimindeki ifadelerin ne anlama geldiklerini ise sırayla şu şeklide ifade edebiliriz.

Public: delegenin erişim belirleyicisi. Public veya private olabilir.

int: metodun geri dönüş tipi. Yani geri dönüş tipi int olan metodları temsil ediyor.

Hesaplayici: delegenin adı.

int a, int b: delegemiz, int tipinde iki adet parametre alan metodları temsil ediyor.

Yukarıda tanımlanan Hesaplayici adlı delege, int tipinde değerler döndüren ve int tipinde iki adet parametre alan metodları temsil etmektedir.

Burada aslında kafaları kurcalayan soru işareti, delegelerin bize sağladığı kolaylığın ne olacağı noktasında yatmaktadır.

Delegelerin temel olarak bize iki noktada büyük faydası vardır. Bunlar:

  • Event kullandığımız programlamada olayların yakalanacağı metodları belirlemek.
  • Çalışma zamanında (runtime) hangi tür metodların kullanılabileceğini belirlemek.

Delegelerin daha iyi anlaşılması açısında bu yazımızdaki örnek uygulamızda delegelerin çalışma zamanında (runtime), belirlediğimiz bir metodun temsil edilmesini canlandırmaya çalışacağız.

Senaryo şu şeklide olacaktır: Sql sorgularını icra etmekle sorumlu bir sınıfın metoduna, sorgu sonrasında bizim gönderdiğimiz bir görevi(metodu) yerine getirmesini sağlamaya .alışacağız. Yani bir metoda parametre olarak bir metod göndereceğiz. Sorgu sonrasında bizim gönderdiğimiz metod çalışacak.

Öncelikle query sonuçlarını yakalayan bir delege olan QueryResultHandler adında bir delege tanımlayacağız.

public delegate void QueryResultHandler(QueryEventArgs args);

Query sonuçlarını bildiren QueryEventArgs adında bir tipimiz mevcut. Bu tipte parametre alan ve void yani geriye birşey döndürmeyen metodların temsilcisini tanımlamış olduk.

public class QueryEventArgs
{
     public bool Executed { get; set; }
}

QueryEventArgs tipi aslında sadece sorgu sonucunda işlemin gerçekleşip gerçekleşmediğini argüman olarak bize veren bir tiptir.

Sql sorgu işlemlerini gerçekleştirecek olan tipimizi de QueryOperation adında bir tip olarak belirleyelim.


public class QueryOperation
{
     public void ExecuteQuery(string queryText, QueryResultHandler executed)
     {
        // execute query
        // ...
        // ..
        // .

        QueryEventArgs result =new QueryEventArgs();
        result.Executed = true;

        executed(result);
     }
}

Sınıfımız temsili bir sınıf olduğu için yani sql sorgusu gerçekleştirmiş gibi bir varsayım aptığımız bir sınıf olduğu için içeriğinde sadece ExecuteQuery adında bir metod tanımladık. Bu metod sorgu işlemini gerçekleştirip QueryEventArgs tipinde bir sonuç oluşturmakta ve parametre olarak gönderilen metodu çalışıtrmaktadır.

Şimdi client tarafında nasıl bir operasyon gerçekleştireceğimize gelelim.

static void Main(string[] args)
{
    QueryOperation operation = new QueryOperation();
    operation.ExecuteQuery("select * form Table", onExecuted);
}

public static void onExecuted(QueryEventArgs args)
{
    Console.WriteLine("query executed!");
}

Yaptığımız işlem sadece QueryOperation tipinde oluşturduğumuz bir nesneye sql sorgu parametresini ve sorgu sonrasında bizim client tarafında tanımladığımız bir metodun parametre olarak göndermektir. Bizim burada tanımladığımız onExecuted metodu tam da delegemizin (QueryResultHandler) formuna uyan bir yapıdadır.

Burada farkına varmamız gerekn bir nokta da delegelerin metod pointer(işaretçi) olduğudur. QueryOperation tipinin ExecuteQuery metodu bir temsilciyi parametre alırken, çalıştırılan bir metoddur. Yani temsilciler metodları işaret ederler.

Programı çalıştırdığımızda aşağıdaki gibi bir sonuç karşımıza çıkacaktır.

Bu örnekte:

  • delege tanımlamanın nasıl yapıldığını
  • çalışma zamanında (runtime) belirlenen bir metodun temsilcisinin çalıştırılmasını
  • delegelerinin birer metod pointer(işaretçi) olduğunu

anlamaya çalıştık.

Bir sonraki yazıda görüşmek dileğiyle…