Подтвердить что ты не робот

Выражение Лямбда против заявления Лямбда

В принципе, есть ли разница между однострочным выражением lambda и выражением 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();
}

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

4b9b3361

Ответ 1

Вам нужна инструкция lambda для многочастных лямбда. Кроме того, инструкции lambdas не поддерживаются поставщиками выражений, такими как 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();

В противном случае они одинаковы.

Ответ 2

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

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

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

Ответ 4

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

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

скобки являются обязательными.

Ответ 5

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

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

Ответ 6

Personnaly, я предпочитаю выражение Lambda. Выражение имеет значение, в котором утверждение отсутствует.

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

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

Ответ 7

То же самое для примера OP, но после С# 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;