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

углубляясь в более продвинутые возможности C #, я наткнулся на код, в котором я точно не знал разницы. Речь идет об этих двух строчках:

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

и

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

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

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

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


person Memet Olsen    schedule 04.09.2012    source источник


Ответы (2)


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

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

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

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

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

person Jon Skeet    schedule 04.09.2012
comment
Спасибо, Джон. Кстати, недавно я начал читать вашу электронную книгу «Глубоко о C #». Очень полезно! - person Memet Olsen; 04.09.2012
comment
@memetolsen: Обратной стороной является то, что если вы прочтете достаточно моих ответов здесь, вы прочтете большую часть содержания книги;) - person Jon Skeet; 04.09.2012
comment
Думаю, 1/3 моих голосов за ваши ответы. Но все же, я бы лучше прочитал книгу в свободное время, чем читал 22 284 ответа :) - person Memet Olsen; 04.09.2012
comment
@memetolsen: Да, определенно лучше организовано :) - person Jon Skeet; 04.09.2012
comment
Я не думаю, что IL для анонимного примера EventHandler отличается, независимо от того, включаете ли вы список параметров или опускаете его, не так ли? Если в IL нет разницы, лямбда все же может быть предпочтительнее для сохранения нажатий клавиш: delegate{X("");} vs (s,a)=>X("") - person phoog; 04.09.2012

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

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

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

person Reed Copsey    schedule 04.09.2012