CodeBlanks Logo Icon CodeBlanks

Expression<T>

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

Expression<TDelegate> ile ifade ağacı tanımlamayı öğrenirsin.

Expression<T> nedir?

Expression<TDelegate>, bir lambdayı veri olarak temsil eden bir ifade ağacıdır (expression tree). Bir lambda Func<T>'a atanırsa çalıştırılabilen bir delege olur; Expression<Func<T>>'a atanırsa veri olur.

Veri olarak ağaç, gövdesini Body, işlem türünü NodeType, parametrelerini Parameters ile gezilebilir. Bu, Entity Framework gibi sağlayıcıların lambdaları SQL'e çevirmesini sağlar. Aynı lambda, hedefe göre delege ya da veri olur.

Func vs Expression

Aynı lambda, hedefe göre iki anlama gelir. Func<int, int> f = x => x * 2; delege üretir; f(3) çağrılabilir. Expression<Func<int, int>> e = x => x * 2; ise veri üretir; e.Body ile içeriği okunabilir.

Derleyici lambdayı hedef tipine göre derler. Bu yüzden aynı yazım, iki farklı yapı üretir. Veri olarak ifade ağacı, ORM ve dinamik sorgu üreticilerinde kritik rol oynar; delege ise çalışma zamanı hesabı için kullanılır.

Uygulama Expression tanımla ve NodeType yazdır

Expression<Func<int, int>> square = x => x * x; şeklinde bir ifade ağacı tanımla. square.NodeType 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.NodeType); ile NodeType 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.NodeType);
    }
}

Kendini test et

  1. Expression ve Func farkı nedir?

    Func<int, int> d = x => x * 2;
    Expression<Func<int, int>> e = x => x * 2;
    • İkisi de aynıdır; ikisi de çalıştırılabilir
    • Func daha hızlıdır, Expression yavaştır
    • Func çalıştırılabilen delege, Expression ise veri olarak ifade ağacıdır
    • Expression yalnızca async işlemler içindir
    Cevabı göster

    Func çalıştırılabilen delege, Expression ise veri olarak ifade ağacıdır — Doğru. Func delege, Expression veri olarak ifade ağacıdır.

  2. Expression bildirimini tamamla

    Expression<____<int, int>> square = x => x * x;
    Cevabı göster
    Expression<Func<int, int>> square = x => x * x;
  3. Türü içeriğine eşle

    Func<int, int>
    Çalıştırılabilen delege
    Expression<Func<int, int>>
    Veri olarak ifade ağacı
    Expression<Func<int, bool>>
    Bool döndüren ifade ağacı
    Func<int, bool>
    Bool döndüren delege

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