Biểu thức Lambda là một cú pháp đơn giản hơn cho các đại biểu ẩn danh và có thể được sử dụng ở mọi nơi mà một đại biểu ẩn danh có thể được sử dụng. Tuy nhiên, điều ngược lại là không đúng sự thật; Các biểu thức lambda có thể được chuyển đổi thành các cây biểu thức cho phép thực hiện nhiều phép thuật như LINQ sang SQL.
Sau đây là một ví dụ về biểu thức LINQ to Object bằng cách sử dụng các đại biểu ẩn danh sau đó biểu thức lambda để cho thấy chúng dễ nhìn hơn bao nhiêu:
// 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();
Các biểu thức Lambda và các đại biểu ẩn danh có lợi thế hơn khi viết một hàm riêng biệt: chúng thực hiện các bao đóng có thể cho phép bạn chuyển trạng thái cục bộ cho hàm mà không cần thêm tham số cho hàm hoặc tạo các đối tượng sử dụng một lần.
Cây biểu hiện là một tính năng mới rất mạnh mẽ của C # 3.0, cho phép API xem xét cấu trúc của biểu thức thay vì chỉ tham chiếu đến một phương thức có thể được thực thi. API chỉ cần tạo tham số ủy nhiệm thành Expression<T>
tham số và trình biên dịch sẽ tạo cây biểu thức từ lambda thay vì ủy nhiệm ẩn danh:
void Example(Predicate<int> aDelegate);
gọi như:
Example(x => x > 5);
trở thành:
void Example(Expression<Predicate<int>> expressionTree);
Cái sau sẽ được thông qua một đại diện của cây cú pháp trừu tượng mô tả biểu thức x > 5
. LINQ to SQL dựa vào hành vi này để có thể biến các biểu thức C # thành các biểu thức SQL mong muốn để lọc / đặt hàng / vv ở phía máy chủ.
delegate
là gì trong C #, tôi khuyên bạn nên đọc phần này trước khi đọc phần còn lại của trang này: stackoverflow.com/questions/2082615/