2008-10-16 61 views

Trả lời

27

The MSDN page on anonymous methods explains it

Trong các phiên bản của C# trước 2.0, chỉ cách để khai báo một delegate là sử dụng phương pháp đặt tên. C# 2.0 đã giới thiệu các phương thức ẩn danh và trong C# 3.0 và sau đó, biểu thức lambda thay thế các phương thức ẩn danh là cách ưa thích để viết mã nội tuyến. Tuy nhiên, thông tin về các phương thức ẩn danh trong chủ đề này cũng áp dụng cho các biểu thức lambda . Có một trường hợp trong , một phương pháp ẩn danh cung cấp chức năng không được tìm thấy trong biểu thức lambda . Các phương thức ẩn danh cho phép bạn bỏ qua danh sách tham số và điều này có nghĩa là một phương thức ẩn danh có thể được chuyển đổi thành các đại biểu có một số chữ ký . Đây không phải là có thể với các biểu thức lambda. Để biết thêm chi tiết về thông tin chi tiết về các biểu thức lambda , hãy xem Lambda Biểu thức (Hướng dẫn lập trình C#).

And regarding lambda expressions:

Một biểu thức lambda là một chức năng vô danh mà có thể chứa các biểu thức và câu lệnh, và có thể được sử dụng để tạo ra các đại biểu hoặc các loại cây biểu thức. Tất cả các biểu thức lambda sử dụng toán tử lambda =>, được đọc là "đi tới". Phía bên trái của toán tử lambda chỉ định các tham số đầu vào (nếu có) và bên phải giữ biểu thức hoặc khối câu lệnh. Biểu thức lambda x => x * x được đọc "x chuyển đến x lần x." Biểu thức này có thể được gán cho loại đại biểu như sau:

10

Đầu tiên, tiện lợi: lambdas dễ đọc và viết hơn.

Thứ hai, biểu thức: lambdas thể được biên dịch để hoặc một đại biểu, hoặc một cây biểu thức (Expression<T> đối với một số đại biểu kiểu T, chẳng hạn như Func<int,bool>). Cây biểu hiện là thú vị hơn, vì nó là chìa khóa để LINQ to out-of-quá trình lưu trữ dữ liệu.

Func<int,bool> isEven = i => i % 2 == 0; 
Expression<Func<int,bool>> isEven = i => i % 2 == 0; 

Lưu ý rằng biểu thức lambda với các cơ quan tuyên bố chỉ có thể được biên soạn để các đại biểu, không Expression s: phương pháp

Action a =() => { Console.WriteLine(obj.ToString()); }; 
21
  1. Anonymous là về cơ bản các chức năng mà không có một tên, với khả năng tạo ra đóng cửa.
  2. Biểu thức Lambda là các cấu trúc có thể chuyển đổi thành cả hai phương thức ẩn danh và cây biểu thức và tuân theo các quy tắc kiểu suy luận phức tạp hơn các phương thức ẩn danh.

Phạm vi của nhiều hay ít tinh tế khác biệt được giải thích bởi Eric Lippert (nhà thiết kế ngôn ngữ C#) trong blog của mình:

22
  1. Biểu thức lambda có thể được chuyển đổi thành đại biểu hoặc cây biểu thức (với một số hạn chế); chỉ có thể chuyển đổi các phương thức ẩn danh thành các đại biểu
  2. Biểu thức Lambda cho phép suy luận kiểu trên các tham số:
  3. Biểu thức Lambda cho phép nội dung được cắt ngắn thành chỉ một biểu thức (trả về giá trị) hoặc một câu lệnh (trong trường hợp khác) không có dấu ngoặc .
  4. Biểu thức Lambda cho phép danh sách tham số được rút ngắn thành tên thông số khi loại có thể được suy ra và khi chỉ có một tham số
  5. Phương thức ẩn danh cho phép danh sách tham số bị bỏ qua hoàn toàn khi nó không được sử dụng trong nội dung và nó không dẫn đến sự mơ hồ

Điểm cuối cùng là lợi ích duy nhất của các phương pháp nặc danh trên lambdas, tôi tin. Thật hữu ích khi tạo một sự kiện giống như trường với đăng ký không có đăng ký mặc dù:

public event EventHandler Click = delegate{}; 
+1

Bạn nên có một huy hiệu "tuyệt vời" .. – nawfal

+0

"Biểu thức Lambda cho phép danh sách tham số được rút ngắn thành tên thông số khi loại có thể được suy ra và khi chỉ có một tham số duy nhất "- Nhiều thông số cũng tốt, phải không? '(x, y) => {}' – Basic

+1

@Basic: Không, đó là tên thông số * trong dấu ngoặc đơn *. So sánh với 'x => x.Length'. Ví dụ của bạn là từ điểm 2, "Biểu thức Lambda cho phép suy luận kiểu về các tham số". –

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