Ekspresi Lambda adalah sintaksis yang lebih sederhana untuk delegasi anonim dan dapat digunakan di mana saja delegasi anonim dapat digunakan. Namun, yang terjadi adalah sebaliknya; ekspresi lambda dapat dikonversi ke pohon ekspresi yang memungkinkan banyak keajaiban seperti LINQ ke SQL.
Berikut ini adalah contoh ekspresi LINQ to Objects menggunakan delegasi anonim kemudian ekspresi lambda untuk menunjukkan betapa lebih mudahnya mata mereka:
// 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();
Ekspresi Lambda dan delegasi anonim memiliki keuntungan daripada menulis fungsi terpisah: mereka menerapkan penutupan yang memungkinkan Anda untuk melewati status lokal ke fungsi tanpa menambahkan parameter ke fungsi atau membuat objek sekali pakai.
Pohon ekspresi adalah fitur baru yang sangat kuat dari C # 3.0 yang memungkinkan API untuk melihat struktur ekspresi alih-alih hanya mendapatkan referensi ke metode yang dapat dieksekusi. API hanya perlu membuat parameter delegasi menjadi Expression<T>
parameter dan kompiler akan menghasilkan pohon ekspresi dari lambda alih-alih delegasi anonim:
void Example(Predicate<int> aDelegate);
disebut seperti:
Example(x => x > 5);
menjadi:
void Example(Expression<Predicate<int>> expressionTree);
Yang terakhir akan melewati representasi pohon sintaksis abstrak yang menggambarkan ekspresi x > 5
. LINQ ke SQL bergantung pada perilaku ini untuk dapat mengubah ekspresi C # ke ekspresi SQL yang diinginkan untuk memfilter / memesan / dll di sisi server.
delegate
ada di C #, saya sangat menyarankan membaca ini sebelum membaca sisa halaman ini: stackoverflow.com/questions/2082615/…