Lambda to expression
Lambda'yı ifade ağacına çevirmeyi öğrenirsin.
Lambda'yı expression'a çevirme
Bir lambda, hedef tipi Expression<T> olduğunda otomatik olarak ifade ağacına çevrilir. Aynı lambda Func<T>'a atanırsa delege, Expression<Func<T>>'a atanırsa veri olur. Çevrim derleme zamanında yapılır.
Ancak her lambda çevrilemez. Yalnızca ifade lambdaları (tek ifade gövdeli) çevrilir. Deyim lambdaları ({ } blok gövdeli) ifade ağacına çevrilemez; yalnızca delege olabilir.
Hangi lambdalar çevrilebilir?
Sadece ifade lambdaları ifade ağacına çevrilebilir. x => x * 2 tek ifade gövdelidir; çevrilir. x => { return x * 2; } deyim blokludur; ifade ağacına çevrilmez, derleme hatası verir.
Bu kısıtlama, ifade ağacının her C# ifadesini değil yalnızca belirli yapıları temsil edebilmesinden kaynaklanır. Atama, if, for gibi deyimler ifade ağacında yoktur. Karmaşık mantık için delege kullanılır.
Uygulama Lambda'yı expression'a çevir ve Body yazdır
Expression<Func<int, int>> square = x => x * x; ile bir lambdayı ifade ağacına çevir. square.Body değerini Console.WriteLine ile yazdır.
Örnek çözümü göster
Expression<Func<int, int>> square = x => x * x; ile ifade ağacını tanımla. Sonra Console.WriteLine(square.Body); ile Body değerini yazdır.
Örnek çözüm:
using System;
using System.Linq.Expressions;
class Program
{
static void Main()
{
Expression<Func<int, int>> square = x => x * x;
Console.WriteLine(square.Body);
}
}
Kendini test et
-
İfade ağacı tipini tamamla
Func<int, int> d = x => x * 2; Expression<____<int, int>> e = x => x * 2;Cevabı göster
Func<int, int> d = x => x * 2; Expression<Func<int, int>> e = x => x * 2; -
Hangisi ifade ağacına çevrilemez?
x => { return x * 2; }- x => { return x * 2; }
- x => x * 2
- (a, b) => a + b
- () => 42
Cevabı göster
x => { return x * 2; } — Doğru. Deyim lambdaları ifade ağacına çevrilemez.
-
Lambda türünü çevrilebilirliğe eşle
- x => x * 2
- Tek ifade - çevrilebilir
- x => { return x; }
- Deyim bloğu - çevrilemez
- (a, b) => a + b
- İki parametre - çevrilebilir
- x => { var y = x; return y; }
- Çok deyimli - çevrilemez