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

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
12
задан nawfal 20 December 2013 в 09:49
поделиться

6 ответов

Да существуют места, где непосредственно использующие анонимные делегаты и лямбда-выражения не будут работать.

, Если метод берет невведенного Делегата тогда, компилятор не знает, что разрешить анонимного делегата/лямбда-выражение в, и Вы получите ошибку компилятора.

public static void Invoke(Delegate d)
{
  d.DynamicInvoke();
}

static void Main(string[] args)
{
  // fails
  Invoke(() => Console.WriteLine("Test"));

  // works
  Invoke(new Action(() => Console.WriteLine("Test")));

  Console.ReadKey();
}

провальная строка кода доберется, ошибка компилятора "Не может преобразовать лямбда-выражение для ввода 'Системы. Делегат', потому что это не тип делегата".

27
ответ дан 2 December 2019 в 03:03
поделиться

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

 delegate(int i) { Console.WriteLine(i.ToString()) }

может быть заменен

f => Console.WriteLine(f.ToString())
8
ответ дан 2 December 2019 в 03:03
поделиться

У делегата есть два значения в C#.

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

delegate ключевое слово может также использоваться для определения встроенной анонимной функции. В случае, где функция является просто отдельным выражением, синтаксис лямбды является более простой альтернативой.

4
ответ дан 2 December 2019 в 03:03
поделиться

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

List<string> names = GetNames();
names.ForEach(Console.WriteLine);
  1. это делает код более читаемым таким образом простой понять.
  2. Это делает код короче таким образом меньшим количеством работы для нас;)

, С другой стороны, очень просто неправильно использовать их. Долго или/и сложные лямбда-выражения имеют тенденцию быть:

  1. Трудно для понимания для новых разработчиков
  2. менее объектно-ориентированный
  3. Намного тяжелее для чтения

Так “does это означает нас, don’t должны больше использовать делегатов или анонимные методы? ” Никакие †“не используют Лямбда-выражение, где Вы выигрываете время/удобочитаемость иначе, рассматривают использование делегатов.

7
ответ дан 2 December 2019 в 03:03
поделиться

Лямбда-выражения являются просто "синтаксическим сахаром", компилятор генерирует соответствующих делегатов к Вам. Можно исследовать это при помощи Отражателя Lutz Roeder.

3
ответ дан 2 December 2019 в 03:03
поделиться

Lamda является просто синтаксическим сахаром для делегатов, они не просто встроены, можно сделать следующее:

s.Find(a =>
{
    if (a.StartsWith("H"))
        return a.Equals("HI");
    else
        return !a.Equals("FOO");
});

И делегаты все еще используются при определении событий, или когда Вы имеете много аргументов и хотите на самом деле сильно тип называемый метод.

3
ответ дан 2 December 2019 в 03:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: