C# İle Fonksiyonel Programlama - Fonksiyon Delegeleri

Giriş

Önceki yazımızda 1, fonksiyonel programlamanın temellerinden bahsederek, Func ve Action delege türüne değindik ve bir fonksiyondan yeni bir fonksiyonun nasıl döndürüleceğine dair kısa bir örnek yaptık.

Bu yazımızda, Func ve Action türlerini daha yakından tanımaya çalışacağız.

Action Delege Türü

Action delege türü, dönüş tipi olmayan (void olan) fonksiyonları temsil etmek için kullanılır.

Hiçbir parametre almayan ve hiçbir dönüş tipi olmayan fonksiyonlar için Action delege türü kullanılır.

delegate-void-action

Tek parametre alan fonksiyonlar içinse jenerik Action<T> delegesi kullanılır.

delegate-void-action-in-T-obj

Action delegesinin 16 jenerik parametreye kadar parametre alan türü mevcuttur.

delegate-void-action-in-T`16

Console.WriteLine Fonksiyonlarını Action ile Temsil Etmek

Console.WriteLine fonksiyonunun (yanlış saymadıysam) 18 adet türevi (overload) mevcut. Dönüş tipleri void olduğu için Action ile temsil edilebilir.

Bunlardan birkaçı:

console-writeline-overloads

WriteLine () metodu için bir delege atayalım ve fonksiyonu çağırmak için bu delegeyi kullanalım. Hiçbir parametre almadığı için jenerik Action delege türünü kullanacağız.

new-line

Çıktısı konsolda boş bir satır.

WriteLine (decimal value) için aynı işlemi yapalım. Bu defa, fonksiyonumuz tek parametre alacağı için jenerik Action<T> delege türevini kullanmamız gerekiyor.

write-decimal

Çıktısı:

199.90

İki örnekte sağ tarafta Console.WriteLine vermemize rağmen derleyici, en uygun jenerik türü belirledi ve kapalı dönüştürme (Implicit Conversation) işlemi uyguladı.

Aynı işlemleri diğer türevler için de uygulayalım:

write-derivatives

Çıktısı:

1C# ile Fonskiyonel Programlamaya Giriş
2(0 items)
3null
43.99
5ipsum

Fonksiyonel Programlamadaki Yeri

Önceki yazımızda fonksiyonel programlamayı tanımlarken bahsettiğimiz:

  • Fonksiyonların değişkenler gibi tanımlanabilmesi
  • Fonksiyonların, diğer fonksiyonlara parametre olarak geçilebilmesi

yöntemlerini uygulayabilmek için Action ve türevlerine ihtiyacımız olacak. newLine, writeDecimal, writeObj, writeObjFmt, writeChrSubArray artık birer değişken oldukları için, bunları fonksiyonlarımızdan döndürebilir, List, Dictionary gibi veri yapılarında saklayabiliriz.

Kullanıcı Tanımlı Action Delegeler

Yukarıdaki örneklerde mevcut fonksiyonlara delege atadık. Bu defa ise fonksiyonlarımızı Action kullanarak tanımlayacağız.

user-defined-actions

Aşağıda yeni bir fonksiyon tanımlayarak bunları delegeler ile temsil edebilmek için C#‘ın bize sağladığı üç farklı yolu görüyorsunuz.

three-ways-of-defining-actions

writeWelcome1, writeWelcome2 ve writeWelcome3, string tipinde tek parametre alan fonksiyonlarımız temsil ediyor. writeHelloWorld ise hiçbir parametre almayan fonksiyonumuzu temsil ediyor.

Tanımladığımız fonksiyonları delegeler aracılığıyla çağıralım:

write-welcome

Çıktısı:

1Merhaba 🌍!
2Hoşgeldiniz Ahmed Şeref.
3Hoşgeldiniz Ahmed Şeref.
4Hoşgeldiniz Ahmed Şeref.

Action Delegesini Listede Saklamak

Fonksiyonları listelerde saklayamıyoruz fakat delegeleri saklayabiliriz. Delegeleri sakladığımız listeleri kullanarak temsil ettikleri fonksiyonları çağırabiliriz.

storing-delegates

Çıktısı:

1#1 | `Action`, listelerde saklanabilir
2#2 | Listedeki delegeleri kullanarak, temsil ettiği
3#3 | fonksiyonları bu şekilde çağırabilirsiniz

Tanımladığımız actions listesi içindeki bütün delegeleri 🌍 parametresi ile çağıralım.

iterating-actions-list-and-calling-theme

Çıktısı:

1🌍
2Hoşgeldiniz 🌍.
3Hoşgeldiniz 🌍.
4Hoşgeldiniz 🌍.

Sonuç

Bu yazımızda Action delegesini tanımaya çalıştık ve fonksiyonel programlama ile ilişkisini örneklerle açıklamaya çalıştık.

Bir sonraki yazımızda dönüş tipi void olmayan fonksiyonlar için kullanmamız gereken Func delegesinden bahsetmeye çalışacağız.

Bağlantılar

  1. https://docs.microsoft.com/en-us/dotnet/api/system.action
  2. https://docs.microsoft.com/en-us/dotnet/api/system.action-16
  3. https://docs.microsoft.com/en-us/dotnet/api/system.console.writeline
  4. https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/conversions#implicit-conversions