2009-04-17 49 views
10

trùng lặp:delegate keyword vs. lambda notationSự khác nhau giữa các biểu thức lambda và các phương pháp vô danh - C#

Tôi hiểu những phương pháp vô danh có thể được sử dụng để xác định các đại biểu và viết hàm inline. Có sử dụng các biểu thức Lambda khác với điều này không?

Tôi đoán tôi hơi bối rối khi sử dụng cái gì.

Chỉnh sửa: Ngoài ra, dường như sử dụng ẩn danh hoặc lambdas, cần có phương pháp Tiện ích mở rộng cho loại này?

Trả lời

4

Không thực sự là không. Về cơ bản, chúng chính là tính năng tương tự với các cấu trúc cú pháp khác nhau. Sự thay đổi nói chung dường như là đi từ cú pháp phương pháp vô danh C# 2.0 đối với cú pháp kiểu lambda cho cả hai biểu thức ẩn danh và chức năng mặc dù.

15

Biểu thức lambda chỉ đơn giản là cú pháp phím tắt cho một phương thức ẩn danh. phương pháp vô danh giống như thế này:

delegate(params) {method body} 

Biểu thức lambda tương đương sẽ trông như thế này:

params => method body 

Nói tóm lại, tất cả các biểu thức lambda là phương pháp vô danh, nhưng nó có thể có một phương pháp vô danh đó là không được viết bằng cú pháp lambda (như ví dụ đầu tiên ở trên). Hy vọng điều này là hữu ích!

+0

+1, nhưng không phải là biểu thức lambda chỉ phát minh lại bánh xe (thay vì kém, vì tôi mặc dù các phương thức ẩn danh có ý nghĩa hơn). –

+0

vì vậy biểu hiện lambada không thể trả lại giá trị? trong khi phương pháp nặc danh có thể? –

+1

SnOrfus: vâng họ làm điều tương tự để bạn nói đúng, đó chỉ là vấn đề sở thích cú pháp.Sasha: cả lambdas và các phương thức nặc danh đều có thể có giá trị trả về. –

6

biểu thức Lambda có thể được chuyển đổi sang cây biểu thức, trong khi các đại biểu vô danh không thể.

5

Chỉ biểu thức lambda mà không phương pháp cơ thể có thể được chuyển đổi sang cây biểu

cấu trúc sau làm biên dịch:

  Func<int> exp1 =() => 1; 
      Func<int> exp2 =() => { return 1; }; 
      Func<int> exp3 = delegate { return 1; }; 
      Expression<Func<int>> exp4 =() => 1; 

Và sau làm không

Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates 
Expression<Func<int>> exp6 =() => { return 1; }; //or lambdas with block body 

Vì vậy, sự khác biệt ngay cả ở cấp độ không cao cấp (Jon Sk eet chỉ ra ở đây sick difference example)

Một điểm khác biệt là bạn có thể tạo đại biểu ẩn danh mà không có danh sách tham số nếu bạn không định sử dụng chúng bên trong thân phương thức, với lambda bạn luôn phải cung cấp tham số.

Sau hai dòng chứng minh sự khác biệt

Func<int, int, int, int, int> anonymous = delegate { return 1; }; 
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1; 

Bạn làm về cơ bản là giống nhau nhưng đại biểu vô danh trông rõ ràng tốt hơn ở đây.

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