İçeriğe geç
Anasayfa » C# Dilinde Function, Action ve Predicate Delegeleri Nedir, Nasıl Kullanılır ve Ne İşe Yarar?

C# Dilinde Function, Action ve Predicate Delegeleri Nedir, Nasıl Kullanılır ve Ne İşe Yarar?

Bu delegeler (delegates), C# dilinde kullanılan delegelerin özel türleridir. Peki delege ne demektir. Ne anlam ifade eder. İsterseniz gelin öncelikle delegelerin ne olduğunu kısaca hatırlayalım.

C# Dilinde DelegeYapısı:

Delegeler, bir metodu başka bir metoda parametre olarak geçirmek, bir metodu bir olaya bağlamak veya bir metodu geri çağırmak gibi senaryolarda yaygın olarak kullanılmaktadır. C# programlama dilinde delege yapısı, bir metodun işaretçisini tutan bir yapıdır. Bu yapı, metotların adres bilgilerini tutar ve bu adresler üzerinden metotlara erişim sağlar. C# dilinde delege yapısı, C ve C++ dillerindeki function pointer yapısına benzer. [1] Bir delege nesnesi, bir veya daha fazla metoda işaret edebilir. Bu özellik, birden fazla metodu tek bir delege nesnesi üzerinden çağırmamızı sağlar.

Aşağıda, bu senaryoların her biri için birer örnek kod bulabilirsiniz.

Bir metodu başka bir metoda parametre olarak geçirmek:

Bu senaryoda, bir metodu, başka bir metot tarafından çağrılacak şekilde bir delegeye atayabilirsiniz.

Örneğin, aşağıdaki kodda, ‘PrintMessage’ adında bir metot tanımladık. Bu metot, bir string parametre alıyor ve ekrana yazdırıyor. Sonra, ‘PrintMessage’ metodunu, ‘public delegate void MessageDelegate(string message)’ tipinde bir delegeye atadık.

Bu delegeyi, ‘ExecuteDelegate’ adında başka bir metoda parametre olarak geçirdik. Bu metot, aldığı delegeyi, belirli bir koşula göre çağırıyor. Böylece, ‘PrintMessage’ metodunu, ‘ExecuteDelegate’ metodu içinde dinamik olarak kullanabiliyoruz (Şekil 1).

Bir metodu bir olaya bağlamak:

Bu senaryoda, bir metodu, bir sınıfın veya bir kontrolün yayınladığı bir olaya atayabilirsiniz.

Örneğin, aşağıdaki kodda, ‘Button’ adında bir sınıf tanımladık. Bu sınıf, ‘Click’ adında bir olay yayınlıyor. Bu olay, ‘public delegate void ClickDelegate()’ tipinde bir delegeye bağlı.

Sonra, ‘HandleClick’ adında bir metot tanımladık. Bu metot, ‘ClickDelegate’ tipinde bir delege olarak tanımlanmış. Bu metodu, ‘Button’ sınıfının bir örneğinin ‘Click’ olayına abone ettik. Böylece, ‘Button’ sınıfının ‘OnClick’ metodu çağrıldığında, ‘HandleClick’ metodu da otomatik olarak çağrılacaktır (Şekil 2).

Şekil 2. Bir Metodu Bir Olaya Bağlama

Bir metodu geri çağırmak:

Bu senaryoda, bir metodu, başka bir metot tarafından geri çağrılacak şekilde bir delegeye atayabilirsiniz.

Örneğin, aşağıdaki kodda, ‘CalculateArea’ adında bir metot tanımladık. Bu metot, bir dikdörtgenin alanını hesaplıyor ve geri dönüyor.

Sonra, ‘CalculateArea’ metodunu, ‘public delegate double AreaDelegate(double width, double height)’ tipinde bir delegeye atadık. Bu delegeyi, ‘DisplayResult’ adında başka bir metoda parametre olarak geçirdik. Bu metot, aldığı delegeyi, belirli bir parametre ile çağırıyor ve sonucu ekrana yazdırıyor.  Böylece, ‘CalculateArea’ metodunu, ‘DisplayResult’ metodu içinde geri çağırabiliyoruz.

Şekil 3. Bir Metodun Başka Bir Metot Tarafından Geri Çağırılması

Func, Action ve Predicate Delegeleri:

Func, Action ve Predicate, C# dilinde kullanılan delegelerin özel türleridir.  Aralarında en temel farkı kısaca açıklayacak olursak; Action dönüş tipi olmayan (void), Func dönüş tipi generic olan, Predicate ise dönüş tipi bool olan özel delege yapılarıdır. Şimdi gelin bu delegeleri örnekler ile inceleyelim.

Func Delegate:

Sıfır veya 16 arasında farklı tiplerde parametre alabilen ve bir değer döndüren metodu temsil eder. Bu parametrelerde sonuncu olanı out return parametresidir. Bir değer döndürmek zorundadır.  .Net içinde built-in olarak gelir. [2]

Örneğin, Func<int, int, int> tipi, iki int parametre alan ve bir int değer döndüren bir metodu temsil eder. Func delegesi, LINQ sorgularında veya lambda ifadelerinde sıkça kullanılır.  Tanımı Şekil 4 de görüldüğü gibidir.

Şekil 4. Func Delegate Tanımı

Örneğin, aşağıdaki kodda, Func<int, bool> tipinde bir delegenin kullanımını görebilirsiniz.

Şekil 5. Func Delegate Kullanım Örneği

Action:

Sıfır veya 16 arasında farklı tiplerde parametre alabilen ve void döndüren bir metodu temsil eder. .Net içinde built-in olarak gelir. [2]

Örneğin, Action<string> tipi, bir string parametre alan ve void döndüren bir metodu temsil eder. Action delegesi, bir metodu başka bir metoda argüman olarak geçirmek istediğinizde kullanışlıdır.

Tanımı Şekil 6 da görüldüğü gibidir.

Şekil 6. Action Delegate Tanımı

Örneğin, aşağıdaki kodda, Action<string> tipinde bir delegenin kullanımını görebilirsiniz.

Şekil 7. Action Delegate Kullanım Örneği

Predicate:

Bir parametre alabilen ve bool döndüren bir metodu temsil eder. .Net içinde built-in olarak gelir. [2] Bir koleksiyonda arama yapmak veya filtrelemek istediğinizde kullanılır.

Tanımı Şekil 8 de görüldüğü gibidir.

Şekil 8. Predicate Delegate Tanımı

Aşağıdaki örnek kodda, predicate<int> tipinde bir delegenin kullanımını görebilirsiniz.

Şekil 9. Predicate Delegate Kullanım Örneği

Delegelerin avantajları nelerdir?

Delegelerin kullanımı, tasarımda ve kodlamada birçok fayda sağlar. Bunlardan bazıları şunlardır:

  • Delegeler, metotları parametre olarak geçirmeyi sağlar. Bu sayede, bir metot, başka bir metot tarafından çağrılabilir veya geri çağrılabilir. Bu, özellikle asenkron işlemler, olaylar, geri bildirimler, sıralama algoritmaları gibi senaryolarda kullanışlıdır. [3],[1]
  • Delegeler, kodun yeniden kullanılmasını kolaylaştırır. Aynı delegeyi, farklı metotlarla ilişkilendirebilir veya farklı metotlara parametre olarak geçirebilirsiniz. Bu, kodun daha modüler ve esnek olmasını sağlar. [3],[5]
  • Delegeler, metotların soyutlanmasını sağlar. Bir metot, bir delegeyi parametre olarak aldığında, delegenin temsil ettiği metot hakkında herhangi bir bilgiye ihtiyaç duymaz. Bu, kodun daha güvenli ve bakımı kolay olmasını sağlar. [3],[4]
  • Delegeler, LINQ sorgularında veya lambda ifadelerinde sıkça kullanılır. Func ve Action delegeleri, LINQ sorgularında veya lambda ifadelerinde kullanılan jenerik delegelerdir. Bu delegeler, kodun daha kısa ve anlaşılır olmasını sağlar. [3]

Delegelerin dezavantajları nelerdir?

Delegelerin kullanımı, tasarımda ve kodlamada birçok avantaj sağlasa da bazı dezavantajları da vardır. Bunlardan bazıları şunlardır:

  • Delegeler, kodun okunabilirliğini azaltabilir. Özellikle, delegeleri çok sık veya yanlış kullandığınızda, kodun akışını takip etmek zorlaşabilir. Delegeleri, gerektiği yerde ve anlamlı şekilde kullanmak önemlidir. [5]
  • Delegeler, bileşeninize beklenmedik davranışlar ekleyebilir. Bir delegenin temsil ettiği metot, sizin kontrolünüz dışında olan üçüncü taraf kodu olabilir. Örneğin, bir olaya abone olan bir delegenin, sonsuz döngüye neden olan veya istisna fırlatan bir metot olması durumunda, bileşeninizin çalışması bozulabilir [5].
  • Delegeler, null olabilir. Bir delegenin null olması durumunda, delegenin çağrılması bir istisna oluşturur. Bu nedenle, delegeleri kullanmadan önce null kontrolü yapmak gerekir. [4]

Kaynakça:

  1. Using Delegates (C# Programming Guide). (Erişim:11 Kasım 2023)
    https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/delegates/using-delegates.  
  2. C#’ta Delegate (Erişim:03 Kasım 2023)
    https://ismailkasan.medium.com/c-ta-delegate-a13ee3bbee15
  3. C# Delegate: Everything You Need To Know About Delegate In C# (Erişim: 07 Kasım 2023)
    https://www.c-sharpcorner.com/UploadFile/puranindia/C-Sharp-net-delegates-and-events/   
  4. Mastering Delegates and Events In C#.NET (Erişim:02 Kasım 2023)
    https://www.c-sharpcorner.com/UploadFile/84c85b/delegates-and-events-C-Sharp-net/
  5. What are the advantages of delegates?  (Erişim:07 Kasım 2023)
    https://stackoverflow.com/questions/639320/what-are-the-advantages-of-delegates
Etiketler:

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir