Каков рекомендуемый способ написания анонимных функций в C #? - PullRequest
1 голос
/ 24 июня 2009
var seq = Enumerable.Range(1, 10).Reverse();
var sort1 = seq.OrderBy(i => i);
var sort2 = seq.OrderBy(delegate(int i) { return i; });

Я думаю, что sort2 более явный, но sort 1 короче. кроме того, я не знаю разницу. Каков рекомендуемый способ сделать это?

Ответы [ 7 ]

12 голосов
/ 24 июня 2009

Лямбда-выражения (IMO) лучше, чем анонимные методы в каждом случае , за исключением , где вам не нужны параметры, в этом случае есть хороший ярлык:

// Lambda expression has to specify parameter types
EventHandler x = (sender, args) => Console.WriteLine("Hi");

// Anonymous method can ignore them
EventHandler x = delegate { Console.WriteLine("Hi"); };

У лямбда-выражений есть еще две "проблемы" IMO:

  • Очевидно, что они недоступны, если вы не используете C # 3. (Хотя вы можете ориентироваться на .NET 2.0 из VS2008 и по-прежнему использовать их.)
  • Синтаксис лямбда-выражения без параметров несколько неуклюж:

    () => stuff
    
2 голосов
/ 24 июня 2009

Я считаю, что это зависит от сценария, поскольку важным аспектом является обеспечение того, чтобы цель вашего кода была хорошо документирована для будущих сопровождающих. Следовательно, иногда лямбда работает лучше, а в других случаях лучше использовать анонимный метод. Проблема с лямбдами, где требуется больше, чем аргумент, заключается в том, что синтаксис начинает выглядеть загроможденным, поэтому иногда бывает полезно использовать синтаксис делегата анонимного метода для обеспечения более узнаваемой структуры.

В приведенном вами примере лямбда - лучший вариант, поскольку она ясна и лаконична; однако при объявлении, скажем, встроенного обработчика событий анонимный метод может обеспечить лучшее решение (с точки зрения удобства обслуживания).

2 голосов
/ 24 июня 2009

Я предпочитаю лямбда-синтаксис (sort1), где это возможно. Я использую только более подробные синтаксисы там, где они требуются. Я считаю, что дополнительный непродуктивный код мешает понять, что я пишу.

Изменить: Если, конечно, я не работаю над приложением .NET 2.0, где вы не можете использовать лямбда-синтаксис. Тогда я просто рад, что у меня есть хотя бы анонимные методы.

1 голос
/ 24 июня 2009

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

public event Action Evt = delegate {};
public event Action Evt = () => { };

... например. В остальное время делегат просто мешает. За комментарий Джона ...

public event EventHandler Evt = delegate {};
public event EventHandler Evt = (s,ea) => { };
0 голосов
/ 24 июня 2009

Я предпочитаю лямбда-выражения, так как они предлагают наиболее лаконичный синтаксис и напоминают лямбды в функциональных языках программирования, откуда эта конструкция изначально пришла. Когда выражение содержит более одного оператора или нефункциональные конструкции, я буду использовать delegate. Беспараметрические, многострочные или явно типизированные лямбда-выражения могут выглядеть несколько странно и, следовательно, теряют свое главное преимущество (будучи более читабельными).

g = (x => 2 * f(x) + 1); // Nice functional one-liner

// but

action = delegate (int arg) {
    SendSystemMessage(arg);
    Console.WriteLine("Got value: {0}", arg);
};
0 голосов
/ 24 июня 2009

sort1 - Lambdas, я думаю, является предпочтительным способом написания анонимных методов

0 голосов
/ 24 июня 2009

Насколько я знаю, оба подхода будут генерировать один и тот же код IL (по крайней мере, в этом примере), так что это действительно вопрос вкуса. Я часто думаю, что лямбда на вкус приятнее.

...