CodeBlanks Logo Icon CodeBlanks

Lambda to expression

C# kursu · İleri seviye · Ders 38/83

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

  1. İ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;
  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.

  3. 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

İleri seviye bölümündeki tüm dersler