Expression<T>
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
-
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.
-
Expression bildirimini tamamla
Expression<____<int, int>> square = x => x * x;Cevabı göster
Expression<Func<int, int>> square = x => x * x; -
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