Выражение лямбда против утверждения лямбда - PullRequest
15 голосов
/ 09 марта 2012

По сути, есть ли разница между однострочным выражением лямбда-выражением и лямбда-выражением? Возьмите следующий код, например:

private delegate void MyDelegate();

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

    myDelegate1();
    myDelegate2();

    Console.ReadKey();
}

Хотя я предпочитаю первое, потому что я считаю, что квадратные скобки некрасивы, есть ли что-то отличное между ними (кроме очевидной части, касающейся использования скобок для многострочных операторов)?

Ответы [ 8 ]

16 голосов
/ 09 марта 2012

Для многостраничных лямбд требуется оператор лямбда.Кроме того, лямбда-выражения не поддерживаются поставщиками выражений, такими как LINQ to SQL.До .NET 4.0 .NET Framework не поддерживала деревья выражений операторов.Это было добавлено в 4.0, но, насколько я знаю, ни один провайдер не использует его.

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();

В остальном они одинаковые.

10 голосов
/ 09 марта 2012

Отражатель на помощь! Разобранный код выглядит так:

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

Так что нет, между ними нет реальной разницы. Будь счастлив.

8 голосов
/ 09 марта 2012

Два одинаковы - первый - синтаксический сахар для второго и оба будут компилироваться в один и тот же IL.

4 голосов
/ 09 марта 2012

Нет, в этом примере нет разницы.Если в теле лямбды есть только одно выражение, вы можете опустить скобки.Однако, если лямбда содержит более одного выражения, например:

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

, скобки обязательны.

3 голосов
/ 18 августа 2014

Если делегат возвращает значение, в выражении lambda необходимо указать return следующим образом.

        Func<int, int, bool> foo = (x, y) => { return x == y; };
        Func<int, int, bool> goo = (x, y) => x == y;
1 голос
/ 09 марта 2012

Personnaly, я предпочитаю лямбда-выражение.Выражение имеет значение там, где выражение не имеет значения.

Я думаю, что следующие ссылки могут вам помочь:

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

0 голосов
/ 10 мая 2019

Из документов (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions):

Лямбды операторов, как и анонимные методы, не могут использоваться для создания деревьев выражений.

0 голосов
/ 18 сентября 2016

То же самое для примера OP, но после C # 6.0, позволяя вам использовать тот же синтаксис выражения для определения обычных не лямбда-методов в классе. Например:

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

Приведенный выше фрагмент кода можно записать только в том случае, если метод можно превратить в одно выражение. Короче говоря, можно использовать лямбда-синтаксис выражения, но не лямбда-синтаксис оператора.

public static double 
              AreaOfTrianglex(double itsbase, double itsheight) => itsbase * itsheight / 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...