2011-08-22 29 views
5

Tôi biết Biểu thức Lambda là gì.Biểu thức vs Lambdas

Nhưng tôi không chắc đó có phải là điều tương tự như Expression hay không. Dường như có nhiều điều để biết ở đây hơn tôi biết.

Tôi đang xem wrapping IQueryable và sử dụng Biểu thức rất nhiều. Vì vậy, ví dụ, có nhiều hơn để tham số 'Expression' ở đây hơn có thể được nghĩ đến trong một Lambda?

public InterceptedQuery(InterceptingProvider provider, Expression expression) 
{ 
    this._provider = provider; 
    this._expression = expression; 
} 

Trả lời

4

Một biểu lambda là một tính năng biên dịch mà được biên dịch, tùy thuộc vào bối cảnh, vào một trong hai điều:

  • A (ẩn) chức năng và một đại biểu để nó
  • Một Expression

Khi ứng dụng đã được biên dịch, khái niệm biểu thức lambda không tồn tại, vì nó đã được tu rned vào một trong hai lựa chọn trên.

Tôi không chắc chắn những gì bạn có ý nghĩa bởi

là có nhiều hơn để tham số 'Biểu hiện' đây hơn có thể được coi là một trong Lambda

Một biểu thức đóng gói và bày tỏ logic ứng dụng trong một hình thức có thể kiểm tra (nói cách khác, nó cho phép bạn xem những gì nhà phát triển đã viết về các thuộc tính và hàm được gọi, hằng số bao gồm, so sánh, v.v.). Đây là cách các nhà cung cấp truy vấn (đối với hầu hết các phần, các trình lập bản đồ quan hệ đối tượng như Entity Framework) lấy mã và biến nó thành SQL.

+0

+1 câu trả lời tuyệt vời. Tại chỗ trên!!! – gideon

1

Lambdas thường được biên dịch mã, trong đó Biểu thức đại diện cho "cây cú pháp trừu tượng" (AST), tức là. một cấu trúc dữ liệu đại diện cho mã, và có thể được biên dịch thành mã. IQueryable thường hoạt động trên Expression bởi vì nó được coi là biên dịch AST để mã chạy trong các môi trường khác nhau, giống như một máy chủ SQL, thay vì chỉ là máy chủ. Có các IQueryableProviders biên dịch thành SQL (Linq2Sql), thành JavaScript, tới các shader OpenGL (Bling), và nhiều hơn nữa.

Các biên dịch C# đôi khi có thể biến một lambda vào một biểu thức, nếu tham số phương pháp dự đoán một biểu hiện của đúng loại:

void Foo(Expression<Func<int>>) { ... } 
... 
Foo(() => 3); 
+0

"Lambdas thường được biên dịch mã" Điều này là không chính xác, trong khi lambdas chắc chắn có thể được sử dụng để tạo mã biên dịch (họ trở thành đại biểu cho ẩn, chức năng tạo ra trình biên dịch), họ cũng được sử dụng để tạo ra 'Expression' đối tượng; bất kỳ cái nào được tạo ra đều được xác định bởi ngữ cảnh. Tôi sẽ downvote, vì thông tin của bạn về AST chắc chắn là đúng, nhưng câu đầu tiên ngụ ý rằng có sự khác biệt giữa Lambdas và Expressions. –

+0

Nhấn mạnh vào * thường *. Sức mạnh biểu cảm đầy đủ của lambdas chỉ có sẵn cho các đại biểu vào lúc này, bởi vì "tuyên bố lambdas" không thể biên dịch thành các biểu thức. Biểu hiện là một tập hợp con nghèo của lambdas. Tôi cũng ước tính rằng phần lớn việc sử dụng lambda là System.Linq, sử dụng các đại biểu, nhưng có lẽ tôi thiên về ước tính đó. – naasking

+0

Tôi không đồng ý ở đó; Tôi nghĩ rằng phần lớn các câu lệnh LINQ là một phần của các truy vấn LINQ-to-SQL hoặc Entity Framework (các ORM khác rõ ràng cũng hỗ trợ cú pháp Expression, nhưng tôi không nghĩ rằng việc sử dụng chúng ở bất cứ đâu gần bằng EF hoặc L2S).Tôi nghĩ rằng thực tế là phần lớn các câu hỏi "LINQ" trên StackOverflow tham khảo một trong hai khung (EF đang bắt đầu tiếp quản như là phần lớn, nhưng L2S ​​là không slouch). –

Các vấn đề liên quan