A lambda kifejezések a delegate típusokhoz kötődnek, azon belül is a névtelenekhez és a generikusokhoz. Egy lambda kifejezés segítségével kulturáltabban, szebben tudunk megadni egy névtelen metódust. Persze ez elsőre ijesztő lehet.
Minden lambda kifejezés tartalmazza a lambda operátort: => A lambda operátor bal oldalán a bemeneti változók szerepelnek, jobb oldalán pedig a névtelen metódus törzse. A lambda operátor jelentése nem definiálható felül.
Ennek a jelentését többféleképpen lehet definiálni. Egyszerűen mondhatjuk azt a => operátor helyett, hogy "legyen". Személy szerint én jobban szeretem egyfajta megfeleltetésnek felfogni a dolgot, mert megmondjuk, hogy megadott bemeneti változókkal mi történjen.
using System;
namespace PeldaLambda
{
class Program
{
static void Main(string[] args)
{
Func<int, int> negyzet = (x) => (x * x);
Console.WriteLine("3 négyzete: {0}", negyzet(3));
Console.ReadKey();
}
}
}
A program kimenete:
3 négyzete: 9
A fenti példában látható, hogy a negyzet egy metódust definiál, ami minden bemeneti x változóra visszaadja annak a négyzetét. Var típusú változóval a fenti példában nem lehetett egyszerűsíteni a Func<int, int> kifejezést, mert a jobb oldalból nem derül ki egyértelműen a típus.
Lambda módon megadott metódusok akkor nagyon hasznosak, ha pár sorból álló eljárást szeretnénk megadni egy generikus delegate típus implementációjának.
C# 7.0 változatától kezdve a lambda operátor alkalmazható metódus implementáció és tulajdonságok kifejtésére is. Ez leginkább akkor hasznos, ha egy soros definíciók tartoznak a tagokhoz.
Ha az implementáció több soros lenne, akkor nem érdemes lambda kifejezésekkel megadni, mert többet árt az olvashatóságnak, mint amit használ.
using System;
namespace PeldaLambda2
{
class Egyszeru
{
private int _x;
public int X
{
get => _x * 2;
set => _x = value;
}
public override string ToString() => "Egyszerű osztály";
}
class Program
{
static void Main(string[] args)
{
var egyszeru = new Egyszeru();
Console.WriteLine(egyszeru);
egyszeru.X = 10;
Console.WriteLine(egyszeru.X);
Console.ReadKey();
}
}
}
A program kimenete:
Egyszeru osztály
20