Lambda ifadeleri , anonim delegeler için daha basit bir sözdizimidir ve anonim bir delegenin kullanılabileceği her yerde kullanılabilir. Ancak bunun tersi doğru değildir; lambda ifadeleri, LINQ to SQL gibi bir sürü büyüye izin veren ifade ağaçlarına dönüştürülebilir.
Aşağıda anonim delegeler ve daha sonra göz üzerinde ne kadar kolay olduklarını göstermek için lambda ifadeleri kullanan bir LINQ to Objects ifadesi örneği verilmiştir :
// anonymous delegate
var evens = Enumerable
.Range(1, 100)
.Where(delegate(int x) { return (x % 2) == 0; })
.ToList();
// lambda expression
var evens = Enumerable
.Range(1, 100)
.Where(x => (x % 2) == 0)
.ToList();
Lambda ifadeleri ve anonim delegelerin ayrı bir işlev yazmaya göre bir avantajları vardır: işleve parametreler eklemeden veya bir kerelik kullanım nesneleri oluşturmadan işleve yerel durumu geçirmenize olanak tanıyan kapaklar uygularlar .
İfade ağaçları , bir API'nin yalnızca çalıştırılabilecek bir yönteme başvurmak yerine bir ifadenin yapısına bakmasına izin veren çok güçlü bir yeni özelliktir. Bir API'nin bir Expression<T>
parametreye bir temsilci parametresi yapması gerekir ve derleyici anonim bir temsilci yerine lambda'dan bir ifade ağacı oluşturur:
void Example(Predicate<int> aDelegate);
şöyle denir:
Example(x => x > 5);
dönüşür:
void Example(Expression<Predicate<int>> expressionTree);
İkincisi , ifadeyi tanımlayan soyut sözdizimi ağacının bir temsilini geçecektir x > 5
. LINQ to SQL, C # ifadelerini sunucu tarafında filtreleme / sıralama / vb. İçin istenen SQL ifadelerine dönüştürebilmek için bu davranışa dayanır.
delegate
C # 'da ne olduğunu bilmeyenler için, bu sayfanın geri kalanını okumadan önce bunu okumanızı şiddetle tavsiye ederim : stackoverflow.com/questions/2082615/…