C# Func önceden tanımlanmış delege türü

20 Ara

Delegeler ile ilgili yazımızda delege tanımlamayı ve kullanmayı incelemiştik. Delegelerin metodları temsil ettiğini ve hangi tür metodların temsil edeceğini ise delegeler oluşturulurken belirlendiğini görmüştük.

Bu yazımızda .Net Framework 3.5 ile gelen ön tanımlı delege olan Func<T> tipini incelemeye çalışacağız.

Func<T> önceden tanımlanmış olan ve T tipinde değerler döndüren metodları temsil eden bir delegedir. Func<T> tipi birden fazla parametre ile beslenebilecek şekilde hazırlanmış bir tiptir. Yani bir veya birden fazla parametre alabilecek metodları temsil eden önceden tanımlanmış bir delege türüdür. Func<T> kullandığımızda delege tanımlamamıza gerek kalmamaktadır.

Func<T>
Func<T,Tresult>
Func<T1,T2,Tresult>
Func<T1,T2,…T3,Tresult>

Her bir T metodun alacağı parametre tipini ve TResult ise temsil edilen metodun dönüş tipipni temsil etmektedir.

Örnek: Func<int,string> delegesi int türünden parametre alan ve string türünden değer döndüren metodları temsil eder.

Yukarıdaki örnekte pageurl adında bir temsilciye, desteklediği formda, yani string dönüş tipinde olan ve int tipinde tek bir parametre alan bir metod atanmıştır.

Func<T> ifadesine, daha önceden oluşturulmuş bir metodu temsil ettrebildiğimiz gibi lambda expression ile de daha önceden tanımlanmamış bir metodu da temsil ettirebiliriz.

Yukarıdaki örneği aşağıdaki gibi lambda ifadesi ile de kısa şekilde yazabiliriz.

Func kavramına kısa bir tanımdan sonra biraz da bu kavrama neden ihtiyaç duyulduğundan bahsedelim. Nerede kolaylık sağlamaktadır.

.Net framework ortamına LINQ sorgularının kullanımı sırasında büyük kolaylık sağlamaktadır. Bir listenin içerisindeki verilerin süzülmesi veya verileriüzerinde değişik işlemler yaparken önceden belirlenmiş Func<T> tipindeki temsilcilere göre sorgular yaptırabiliriz. .Net işlerimizi kolaylaştırmak için Func<T> delegelerini oluşturmuş ve kullanımımıza sunmuştur.

Yukarıda List<int> listesi içerisindeki sayılardan 30’dan küçük olanları seçmek için listenin where extension metodunu kullanıyoruz. Where extension metodu Func<int,bool> şeklinde bir delegeyi parametre olarak almaktadır. Select adında oluşturduğumuz metod da int türünde parametre almakta ve bool türünden sonuç döndürmektedir.

Bu ifadenin lambda ifadesi şu şekilde olmaktadır.

Kendi oluşturduğumuz sınıflarımızda da Func<T> delegelerini kullanarak pratik işlemler yaptırabiliriz.

Bu yazımızda:

  • Func<T> delegesinin ne olduğunu
  • Nasıl kullanıldığını
  • Nerelerde karşımıza çıkabileceğini

Görmeye çalıştık.

Tekrar görüşmek dileğiyle…

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…