Lambda Deyimleri (Lambda Expressions)
C# 3.0 ile .NET dünyasına giriş yapan bu terim aslında epeyce akademik derinlikli bir geçmişe sahip. Meselenin odağımız dışında kalan bu tarafına merak duyanları Wikipedia maddesine şutlayarak devam ediyoruz.
Lambda'yı pat diye anlatmak yerine adım adım gidelim diyoruz, kabul ederseniz. Sıramız şöyle:
- Delegate yapısı
- Anonim Metodlar
- Lambda deyimleri
Delegate Yapısı (C# 1.0)
Delegate (delege) yapısı, tipli fonksiyon işaretçisi olarak tanımlanıyor. Ama bu tanım gayet soğuk durduğu için biz başka bir tanım verelim. Nasıl ki sayılar için int, long; karakterler için char, string vs. gibi veri tipleri tanımlanmışsa .NET dillerindeki "metod" yapılarının da tipi tanımlanmış. Bir metod, parametre listesine ve dönüş değerine göre bir "tip" yani bir delegate ifade eder.
Örneğin :
int KareAl(int x)
{
return x * x;
}
Bu metodun tipini yani delegesini yazalım :
delegate int KareAlanFonksiyon(int x);
Ne güzel!
KareAl tek bir fonksiyon olurken, KareAlanFonksiyon bizim için bir int alan ve int dönen fonksiyonların ortak tipi oldu.
Yukarıda bir delegeyi sadece tip olarak tanımladık. Şimdi bu delegeyi canlandıralım da işe yarasın:
KareAlanFonksiyon golgeKareAl = new KareAlanFonksiyon(KareAl);
En başta tanımladığımız gövdesi olan komple bir metod ile canlı bir delege oluşturduk. Tahmin edebileceğiniz gibi bu satırdan sonra golgekareAl(2) çağrısı bize 4 verecektir. Bu satırı şöyle de yazabilirdik kısaca:
KareAlanFonksiyon golgeKareAl = KareAl;
Console.WriteLine(golgeKareAl(2));
Anonim Metodlar (C# 2.0)
Adı sanı belli olmayan, direk gövdesini yazarak oluşturduğunuz formalitesi az olan metodlardır. Anonim metodları delegate mahfuzuyla tanımlarız.
Yukarıda hâzır bir metodu (KareAl) kullanarak delege örneği oluşturmuştuk. Şimdi bir adet daha delege örneği oluşturalım fakat metodumuz o anda yazdığımız bir anonim metod olsun:
KareAlanFonksiyon golgeKareAlAnonim = delegate(int x) { return x * x; };
Gidip KareAlanFonksiyon tipiyle uyuşan bir metod yazmak yerine o anda sadece gövdesini yazarak bir metod tanımlamak güzel bir kolaylık. Dikkat edilmesi gereken, delegate mahfuzundan sonra parantez içerisinde girdi parametreyi aynen tanımlamamız.
Lambda Deyimleri (C# 3.0)
C# dilinin üçüncü versiyonu, delegelerin kullanımı için lambda boncuğunu getirdi. Nihâi amaç LINQ'ya hizmet etse de biz de bu dil boncuğunu her yerde rahatlıkla kullanabiliriz. Boncuk dediğimiz şeye teknik literatürde syntactic-sugar deniyor. İşlevsel bir yenilik katmadan sadece sözdizimi hoşlaştıran şeyler demek.
Lambda'nın hoşluğuna bakalım:
KareAlanFonksiyon golgeKareAlLambda = delegate(int x) { return x * x; };
deyimi oluyor size:
KareAlanFonksiyon golgeKareAlLambda = (int x) => { return x * x; };
Yeter mi? Yetmez:
KareAlanFonksiyon golgeKareAlLambda = (int x) => x * x;
Eğer tip otomatik olarak sezilebiliyorsa bu da yetmez:
KareAlanFonksiyon golgeKareAlLambda = x => x * x;
Yetsin buraya kadar. Boncuk daha fazla ileri gidemiyor.
Evet dostlar, şahit olduğumuz gibi delege örneğini az ve öz bir ifadeyle oluşturabiliyoruz artık. Örnek istediğinizi duyar gibiyiz. Hadi o zaman.
Örnek Mahallesi
var helvaMalzemeleri = new[] { "şeker", "un", "yağ" };
var malzemeVarMidir = helvaMalzemeleri.Any(malzeme => malzeme == "yağ");
Console.WriteLine(malzemeVarMidir); // True yazar
Lambda kullanalım diye suyunu çıkarmışız değil mi? Hem kendi kendine tiplenen diziler hem kendi kendine tiplenen lokal değişkenler (var) hem lambda ve hem de helva. Helva dışında hepsi C# 3.0 özelliği.
Hepinize kolay gelsin.
Lambda ile.
