Merhaba,
Merhaba, bu yazıda C# Func(önceden tanımlanmış delege) konusu hakkında sahip olduğum bilgiler ve araştırmalarımı aktarmak istiyorum.
C# birçok durumda geleneksel delege kullanımına zorunlu kalmamak için hazır delege tipleri(generic delegate types) olan Func ve Action’ı içermektedir.
Action ve Func arasında kullanım farkları bulunmaktadır. Bir örnek vermek gerekirse Func parametre olarak geriye değer döndüren tipte bir delege tipidir. İkisi arasındaki kullanım farklarını daha detaylı görmek için buradan bilgi alabilirsiniz.
İlk olarak Func delegesinin temel mantık olarak nereden meydana geldiği ve ne gibi yerlerde karşımıza çıktığı konuları üzerinde duralım.

Parametre içeren bir metodu kapsüller ve TResult ile belirtilen türde değer döndürür.
Şimdi ise bir Func delegesinin nasıl bildirileceğini ve kullanılacağını görelim.

Bu kullanımı bir örnek üzerinde görecek olursak;
Yukarıda görüldüğü üzere Func<string,string,string> tipinde ve add isminde delege tanımladık. Daha sonra Info metodunu bu delege ile işaretledik. Zaten Info metodunu yazmadan bu kısmı tamamlarsak C# bizden Info isminde 2 parametreli bir metot oluşturmamızı isteyecektir.
Yukarıda 2 parametreli bir delege tanımladık ancak belirli bir parametre adedi olması gibi zorunluluklar yoktur. Normal metot kullanımında nasıl ki parametre zorunluluğu yoksa bu da kullanım olarak aynı şekildedir.
Buna bir örnek verecek olursak;
Yukarıda görüldüğü üzere parametre olmadan sadece dönüş tipi olan bir delege tanımladım ve dateInfo metodunu bununla işaretledim. Burada şu nokta dikkatinizi çekmiş olabilir. dateInfo metodu static bir metottur. Bunun nedeni örnekteki Main metodunun static olmasıdır. Eğer bu işlemleri static olmayan bir metotta yazarsak böyle bir durum olmaz.
Şimdi ise bu metot yazım türünü görelim. Burada farklı olarak Lambda Expression kullanarak bir metot tanımlayalım.
Yukarıdaki kullanımda ise önceki kullanımdan farklı olarak metodun gövdesi ve parametreleri bulunmaktadır ancak ismi bulunmamaktadır. Bu tür metotlara Anonymous Methods adı verilir. Aslında bu kullanım birçok yerde karşımıza çıkmaktadır.
Aşağıda oluşturduğumuz int tipinde bir List içerisinde LINQ sorgusu ile istenilen değerlere ulaşmak istersek;

Burada Where metodu içerisinde LINQ sorgumuzu yazıyoruz ancak dikkat ettiyseniz bu kısım Func<int,bool> predicate tipinde delege ile işaretlenmiş bir metot olacak. Şimdi ise Where metodu içerisine Lamba Expression ile bir sorgu yazıyoruz.
Burada sonucu 23,88,35 olarak görürüz. Az önce Func<int,int,int> sum delegesi ile gösterdiğim örnekteki metot ve Where içerisinde yazdığımız LINQ sorgusunun benzerliğini gördünüz.
Biz aslında burada Where içerisinde Func<int,bool> predicate ile işaretlenmiş olan bir metot kullandık.
Son olarak ise bu konuda edindiğim birkaç bilgi ile özet kıvamında bu yazıyı tamamlamak istiyorum.
- Func delege tipi mutlaka geriye değer döndürmek zorundadır.
- Bu delege tipi parametre alma gibi bir zorunluluğa sahip değildir.
- Func delege tipi 16 adede kadar parametre alabilir.
- Ref ve out parametreleri Func delegelerinde kullanılamaz.
- Yukarıda da gördüğümüz üzere Func delege tipi bir anonymous method veya lamba expression ile kullanılabilir.
Ana mantık olarak umarım kendi bildiğim ve anladığım kısımları aktarabilmişimdir.
Eksik gördüğünüz veya eklemek istediğiniz bilgiler olursa benimle de paylaşırsanız mutlu olurum.
Okuduğunuz için teşekkür ederim.