Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Да существуют места, где непосредственно использующие анонимные делегаты и лямбда-выражения не будут работать.
, Если метод берет невведенного Делегата тогда, компилятор не знает, что разрешить анонимного делегата/лямбда-выражение в, и Вы получите ошибку компилятора.
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();
}
провальная строка кода доберется, ошибка компилятора "Не может преобразовать лямбда-выражение для ввода 'Системы. Делегат', потому что это не тип делегата".
лямбда является ярлыком для анонимного делегата, но Вы будете всегда использовать делегатов. делегат определяет подпись методов. можно просто сделать это:
delegate(int i) { Console.WriteLine(i.ToString()) }
может быть заменен
f => Console.WriteLine(f.ToString())
У делегата есть два значения в C#.
ключевое слово delegate
может использоваться для определения функционального типа подписи. Это обычно используется, когда defininge подпись функций высшего порядка, т.е. функций, которые берут другие функции в качестве аргументов. Это использование делегата все еще релевантно.
delegate
ключевое слово может также использоваться для определения встроенной анонимной функции. В случае, где функция является просто отдельным выражением, синтаксис лямбды является более простой альтернативой.
Лямбда-выражение не (и не был предназначен, чтобы быть), серебряная пуля, которая заменит (скрывают) делегатов. Это является большим с маленькими локальными вещами как:
List<string> names = GetNames();
names.ForEach(Console.WriteLine);
, С другой стороны, очень просто неправильно использовать их. Долго или/и сложные лямбда-выражения имеют тенденцию быть:
Так “does это означает нас, don’t должны больше использовать делегатов или анонимные методы? ” Никакие †“не используют Лямбда-выражение, где Вы выигрываете время/удобочитаемость иначе, рассматривают использование делегатов.
Лямбда-выражения являются просто "синтаксическим сахаром", компилятор генерирует соответствующих делегатов к Вам. Можно исследовать это при помощи Отражателя Lutz Roeder.
Lamda является просто синтаксическим сахаром для делегатов, они не просто встроены, можно сделать следующее:
s.Find(a =>
{
if (a.StartsWith("H"))
return a.Equals("HI");
else
return !a.Equals("FOO");
});
И делегаты все еще используются при определении событий, или когда Вы имеете много аргументов и хотите на самом деле сильно тип называемый метод.