Khi bạn cần tạo một thể hiện của một đại biểu trong đó có một tham số duy nhất, biểu thức lambda cho phép bạn tạo mà đại biểu "inline" một cách rất ngắn gọn. Ví dụ, đây là mã để tìm thấy một người đặc biệt trong một danh sách, bởi tên của họ:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(p => p.Name == "Jon");
Trong C# 2.0, bạn có thể sử dụng một phương pháp vô danh đó là longwinded hơn một chút, nhưng không quá xấu:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });
Trong C# 1.0, bạn phải tạo ra toàn bộ phương thức bổ sung. Ngoài ra, nếu bạn muốn parameterise nó, bạn sẽ phải tạo ra một loại khác nhau, trong khi đó phương pháp vô danh và biểu thức lambda chụp môi trường thực thi của họ (các biến địa phương vv) để họ hành động như đóng cửa:
public Person FindByName(List<Person> list, String name)
{
return list.Find(p => p.Name == name); // The "name" variable is captured
}
Có nhiều về điều này trong my article about closures.
Trong khi chuyển giao đại biểu vào các phương pháp không phải là rất phổ biến trong C# 2.0 và .NET 2.0, đó là một phần lớn của cơ sở LINQ - vì vậy bạn có xu hướng sử dụng nó rất nhiều trong C# 3.0 với .NET 3.5.
Nguồn
2008-10-01 09:16:35
Đó là những gì tôi nghĩ. Làm cách nào để giúp gọi điện trực tiếp ToString? –
Không phải tất cả. Nó phụ thuộc vào ngữ cảnh bạn sử dụng nó. –
David: Giả sử bạn muốn chuyển đổi một danh sách các số nguyên thành một danh sách các chuỗi. Bạn có thể viết một thói quen chuyển đổi tổng quát, nhưng nó cần một đại biểu để áp dụng cho * mỗi giá trị * trong danh sách - và các biểu thức lambda giúp dễ dàng xác định ủy nhiệm đó hơn. –