2012-09-04 72 views
10

trong khi nâng cao bản thân mình với các tính năng nâng cao hơn của C#, tôi đã gặp một số mã mà tôi không biết chính xác sự khác biệt. Đó là về hai dòng sau:Sự khác biệt giữa Func <> với biểu thức đại biểu và lambda

Func<string, int> giveLength = (text => text.Length); 

Func<string, int> giveLength = delegate(string text) { return text.Length; }; 

Điều này có thể được sử dụng trong cùng một cách:

Console.WriteLine(giveLength("A random string.")); 

Vì vậy, về cơ bản .. sự khác biệt của hai dòng này là gì? Và những dòng này có biên dịch cho cùng một CIL không?

Trả lời

16

Về cơ bản, chúng giống nhau. Cả hai đều là chức năng ẩn danh trong thuật ngữ đặc điểm kỹ thuật của C#.

Biểu thức Lambda nói chung ngắn gọn hơn và cũng có thể được chuyển đổi thành expression trees, điều này rất quan trọng đối với LINQ ngoài quy trình.

Phương pháp ẩn danh cho phép bạn thả danh sách tham số nếu bạn không quan tâm. Ví dụ:

EventHandler handler = delegate { 
    Console.WriteLine("Sender and args don't matter"); 
}; 

Cho ít khi có yêu cầu thứ hai, các phương pháp vô danh đang trở thành một loài có nguy cơ tuyệt chủng trong C# hiện đại. Biểu thức Lambda phổ biến hơn nhiều.

+0

Cảm ơn Jon. Btw Gần đây tôi đã bắt đầu đọc ebook của bạn 'C# in Depth'. Rất hữu ích! –

+3

@memetolsen: Nhược điểm là, nếu bạn đọc đủ câu trả lời của tôi ở đây, bạn sẽ đọc hầu hết nội dung của cuốn sách;) –

+2

Tôi nghĩ 1/3 số người trả lời của tôi là câu trả lời của bạn. Nhưng vẫn còn, tôi muốn đọc cuốn sách trong thời gian rảnh rỗi thay vì đọc 22,284 câu trả lời :) –

6

Vì vậy, về cơ bản .. Sự khác biệt của hai dòng này là gì? Và những dòng này có biên dịch cho cùng một CIL không?

Chỉ có hai cách khác nhau để viết cùng một thứ. Cú pháp lambda là mới hơn và ngắn gọn hơn, nhưng chúng cũng làm như vậy (trong trường hợp này).

Lưu ý rằng cú pháp lambdas (=>) cũng có thể được sử dụng để tạo thành Expression Lambdas, nơi bạn thực hiện Expression Tree thay vì một đại biểu. Điều này là tốt đẹp vì bạn có thể sử dụng cùng cú pháp cho dù bạn đang sử dụng LINQ to Objects (dựa trên các đại biểu như Func<T, TResult>) hoặc LINQ to Entities (sử dụng IQueryable<T> và cây biểu thức).

+0

Cảm ơn câu trả lời của bạn! –

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