Разница между Func <> с делегатом и выражением лямбда

углубляя себя до более продвинутых функций С#, я натолкнулся на некоторый код, который я точно не знал разницы. Он об этих двух строках:

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

и

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

Это можно использовать так же:

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

Итак, в основном. В чем разница между этими двумя строками? И связаны ли эти строки с тем же CIL?

Ответ 1

Они одинаковые, в основном. Они являются анонимными функциями в терминологии спецификации С#.

Лямбда-выражения, как правило, более кратки и также могут быть преобразованы в деревья выражений, которые имеют решающее значение для внепроцессного LINQ.

Анонимные методы позволяют вам отбросить список параметров, если вам все равно. Например:

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

Учитывая, как редко последний момент требуется, анонимные методы становятся исчезающим видом в современном С#. Лямбда-выражения гораздо чаще встречаются.

Ответ 2

Итак, в основном. В чем разница между этими двумя строками? И связаны ли эти строки с тем же CIL?

Есть только два разных способа написать одно и то же. Синтаксис лямбда более новый и более краткий, но они делают то же самое (в данном случае).

Обратите внимание, что синтаксис lambdas (=>) также может использоваться для формирования Expression Lambdas, где вы создаете Дерево выражений вместо делегата. Это хорошо, поскольку вы можете использовать тот же синтаксис, используете ли вы LINQ для объектов (которые основаны на таких делегатах, как Func<T, TResult>) или LINQ to Entities (который использует IQueryable<T> и деревья выражений).