2010-06-05 33 views
13

Tôi mới trong C# và trước đó tôi thấy các biểu thức lambda là nhưC# Cú pháp biểu thức Lambda: là dấu ngoặc cần thiết?

(params) => { expression;} 

nhưng trong LINQ, tôi thấy ví dụ như

IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName); 

Không dấu ngoặc đơn.

Chúng có giống nhau hoặc có sự khác biệt nào không?

Cảm ơn rất nhiều.

+0

Bạn có nghĩa là niềng răng, dấu ngoặc hoặc cả hai? Nhiều giải thích- http://en.wikipedia.org/wiki/Bracket Danh sách đối số, thân mã hoặc cả hai (toàn bộ biểu thức? –

+12

'{}' là dấu ngoặc, '()' là dấu ngoặc đơn và '[]' là – Donnie

+0

Tôi xin lỗi vì tôi không rõ ràng về các ý nghĩa khác nhau của các từ, dấu ngoặc đơn và dấu ngoặc đơn.Tôi thực sự có nghĩa là cả {} và() – LLS

Trả lời

23

Các quy tắc là:

Biểu thức lambda có dạng

(modifier type parameter, modifier type parameter ...) => { statements } 

Hãy xem xét phía bên trái trước tiên.

Công cụ sửa đổi có thể được ref, out hoặc không có gì cả.

Nếu không có công cụ sửa đổi hoặc chỉnh sửa thì tất cả các loại có thể được ưu tiên. Nếu có bất kỳ công cụ sửa đổi hoặc chỉnh sửa nào thì mỗi khai báo tham số phải có loại được khai báo.Nếu bất kỳ thông số nào có loại được khai báo thì mỗi tham số phải có loại được khai báo. Vì vậy, bạn có thể bỏ qua các loại được cung cấp rằng (1) không có refs hoặc outs, và (2) bạn elide tất cả trong số họ. Nếu không, bạn phải cung cấp tất cả các loại.

Nếu có chính xác thông số và loại của nó đã được ưu tiên thì các dấu ngoặc đơn quanh danh sách tham số cũng có thể được ưu tiên tùy chọn.

Đó là tất cả các quy tắc về danh sách tham số. Các quy tắc về phía bên phải là:

nếu danh sách tuyên bố bao gồm một lệnh return duy nhất với một biểu thức:

x => { return x + 1; } 

thì niềng răng, từ khóa trở lại và dấu chấm phẩy chưa elided:

x => x + 1 

hơn nữa, nếu danh sách tuyên bố bao gồm một tuyên bố duy nhất đó là một biểu thức tuyên bố:

x => { x++; } // Not returning the value of x++; only useful for the side effects 
x => { new Y(x); } // weird! executing a ctor only for its side effects! But legal! 
x => { M(x); } // note, not returning the value of M(x) even if there is one. 

sau đó nó cũng là hợp pháp để bõ mẫu âm chót dấu ngoặc và dấu chấm phẩy:

x => x++ 
x => new Y(x) 
x => M(x) 

Lưu ý rằng những hiện nay có khả năng một cái gì đó có ý nghĩa khác nhau để người đọc! Trước khi chúng tôi rõ ràng là loại bỏ giá trị trả về; bây giờ lambdas sẽ được đọc là trả lại chúng.

Lưu ý rằng điều này có nghĩa là việc thực hiện thủ thuật này là hợp pháp với các phương thức trả lại trống. Điều này thực sự hợp pháp:

x => Console.WriteLine(x) 

Yuck. Đừng làm vậy. Nếu bạn có nghĩa là

x => { Console.WriteLine(x); } 

thì hãy nói thay thế. Trước đây có vẻ quá giống như bạn đang cố gắng nói

x => { return Console.WriteLine(x); } 

tất nhiên sẽ là bất hợp pháp.

+0

+1 để đặt dấu ngoặc ôm xung quanh các phương thức trả về void. Tôi sẽ đi xa như vậy để nói rằng nếu mục đích chính của việc gọi phương pháp là tạo ra một tác dụng phụ, đặt nó vào niềng răng để nó trông có vẻ cởi mở hơn. –

+0

Giải thích rất chi tiết. Cảm ơn rất nhiều. – LLS

+1

điều này có nghĩa là bạn sẽ xem xét một người nào đó viết một phương pháp lấy một biểu hiện đang làm điều gì đó khuyến khích mã hóa kém? Không phải là tôi đã từng làm nó nhưng câu hỏi xuất hiện trong đầu tôi khi tôi viết nó. – ShuggyCoUk

5

Bạn chỉ cần dấu ngoặc nếu bạn có nhiều tham số.

Cập nhật (Theo thông lệ trên SO khi câu trả lời được sửa sau khi những người khác đã trả lời ...)

Sử dụng dấu ngoặc đơn (ngoặc đơn "()" và niềng răng "{}") là trường hợp này là không cần thiết . Các tuyên bố là tương đương. Một Visual Studio add-in như ReSharper sẽ chỉ dư thừa như thế này ra:

http://www.jetbrains.com/resharper/

15

Những dấu ngoặc đang nói gì vậy? () hoặc {}?


() được sử dụng trong danh sách tham số và được yêu cầu khi bạn có nhiều hơn một tham số:

(a, b, c) => ... 

Bạn có thể bỏ qua chúng khi bạn chỉ có một đối số:

a => ... 

{} al thấp bạn đặt một khối báo cáo trong cơ thể của biểu thức lambda:

(a, b, c) => { 
       Console.WriteLine("Hello World!"); 
       Console.WriteLine("a = {0}", a); 
       Console.WriteLine("b = {0}", b); 
       Console.WriteLine("c = {0}", c); 
       return a * b + c; 
      } 

Không có chúng, cơ thể của một biểu thức lambda là một biểu:

(a, b, c) => a * b + c 
+0

Bạn đang nói về ví dụ về niềng răng hơn là dấu ngoặc vuông? –

+0

Cảm ơn bạn, điều đó giải thích rất nhiều. – LLS

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