2012-03-09 44 views
13

Về cơ bản, có sự khác biệt nào giữa lambda biểu thức dòng đơn và lambda câu lệnh không? Đi đoạn mã sau, ví dụ:Biểu thức Lambda so với tuyên bố Lambda

private delegate void MyDelegate(); 

protected static void Main() 
{ 
    MyDelegate myDelegate1 =() => Console.WriteLine("Test 1"); 
    MyDelegate myDelegate2 =() => { Console.WriteLine("Test 2"); }; 

    myDelegate1(); 
    myDelegate2(); 

    Console.ReadKey(); 
} 

Trong khi tôi thích là người đầu tiên vì tôi tìm thấy những dấu ngoặc là xấu xí, là có bất cứ điều gì khác nhau giữa hai (ngoài phần rõ ràng về yêu cầu khung cho báo cáo đa dòng) ?

+2

Vâng, dấu ngoặc vuông. – Oded

Trả lời

13

Bạn cần tuyên bố lambda cho lambdas đa cấp. Ngoài ra lambdas tuyên bố không được hỗ trợ bởi các nhà cung cấp biểu thức như LINQ to SQL. Trước .NET 4.0 .NET Framework không hỗ trợ các cây biểu thức câu lệnh. Điều này đã được thêm vào 4.0 nhưng theo như tôi biết không có nhà cung cấp sử dụng nó.

Action myDelegate1 =() => Console.WriteLine("Test 1"); 
Expression<Action> myExpression =() => { Console.WriteLine("Test 2") }; //compile error unless you remove the { } 
myDelegate1(); 
Action myDelegate2 = myExpression.Compile(); 
myDelegate2(); 

Nếu không thì chúng giống nhau.

7

Hai số này giống nhau - đầu tiên là syntactic sugar đến số thứ hai và cả hai sẽ biên dịch thành cùng một IL.

3

Không, không có sự khác biệt trong ví dụ này. Nếu cơ thể của lambda chỉ là một biểu thức, bạn có thể thả các dấu ngoặc. Tuy nhiên, khi lambda chứa nhiều hơn một biểu thức, như vậy:

MyDelegate myDelegate2 =() => { 
    Console.WriteLine("Test 2");      
    Console.WriteLine("Test 2"); 
}; 

dấu ngoặc là bắt buộc.

1

Cá nhân, tôi thích Biểu thức Lambda. Biểu thức có giá trị trong đó Tuyên bố không có.

tôi nghĩ rằng các liên kết sau đây có thể giúp bạn:

http://lambda-the-ultimate.org/node/1044

10

Reflector để giải thoát! Mã được tháo rời trông giống như sau:

private static void Main(string[] args) 
{ 
    MyDelegate myDelegate1 = delegate { 
     Console.WriteLine("Test 1"); 
    }; 
    MyDelegate myDelegate2 = delegate { 
     Console.WriteLine("Test 2"); 
    }; 
    myDelegate1(); 
    myDelegate2(); 
    Console.ReadKey(); 
} 

Vì vậy, không, không có sự khác biệt thực sự nào giữa hai loại. Hãy hạnh phúc.

2

Nếu đại biểu trả về một giá trị, return là cần thiết trong lambda tuyên bố như sau.

 Func<int, int, bool> foo = (x, y) => { return x == y; }; 
     Func<int, int, bool> goo = (x, y) => x == y; 
+0

Kẻ phản đối có thể không hiểu họ làm gì. :-) –

0

Tương tự cho ví dụ OP, nhưng sau C# 6.0, cho phép bạn sử dụng cùng một cú pháp biểu thức để xác định phương pháp không phải lambda bình thường trong một lớp. Ví dụ:

public static double AreaOfTriangle(double itsbase, double itsheight) 
{ 
    return itsbase * itsheight/2; 
} 

Đoạn mã trên có thể được viết chỉ khi phương pháp có thể được chuyển thành một biểu thức duy nhất. Tóm lại, nó có thể được sử dụng cú pháp lambda biểu thức, nhưng không phải cú pháp lambda của câu lệnh.

public static double 
       AreaOfTrianglex(double itsbase, double itsheight) => itsbase * itsheight/2;