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.

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

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

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çı:

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.

Çı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.

Çıktısı:
99.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:

Çıktısı:
C# ile Fonskiyonel Programlamaya Giriş
(0 items)
null
3.99
ipsum
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.

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.

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:

Çıktısı:
Merhaba 🌍!
Hoşgeldiniz Ahmed Şeref.
Hoşgeldiniz Ahmed Şeref.
Hoş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.

Çıktısı:
#1 | `Action`, listelerde saklanabilir
#2 | Listedeki delegeleri kullanarak, temsil ettiği
#3 | fonksiyonları bu şekilde çağırabilirsiniz
Tanımladığımız actions listesi içindeki bütün delegeleri 🌍 parametresi
ile çağıralım.

Çıktısı:
🌍
Hoşgeldiniz 🌍.
Hoşgeldiniz 🌍.
Hoş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
- https://docs.microsoft.com/en-us/dotnet/api/system.action
- https://docs.microsoft.com/en-us/dotnet/api/system.action-16
- https://docs.microsoft.com/en-us/dotnet/api/system.console.writeline
- https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/conversions#implicit-conversions
