2016-12-29 5 views
0
  1. все ли анонимные функции нужно вводить с помощью ключевого слова delegate? например, у нас есть класс Customer,лямбда-выражение, анонимная функция делегатов в C#

    delegate(Customer a) 
    {return a.name == "Michael";} 
    

Это анонимная функция

(Customer a) 
    {return a.name == "Michael";} 

функция или делегат или оба?

  1. делать все лямбда выражения также предикат делегат по умолчанию? например, у нас есть список клиентов, что является listCustomers, если мы хотим использовать TrueForAll функцию, чтобы увидеть, все ли клиенты под названием «Майкл», мы можем просто набрать как:

    listCustomers.TrueForAll(x => x.name == "Michael); 
    

Но TrueForAll принимает Сказуемое в качестве параметра, как мы знаем Predacate является делегатом, что означает «х => x.name ==„Michael“также Predicate делегат по умолчанию

+0

Второй блок кода не является анонимной функции. На самом деле, это не что-то - этот код не будет компилироваться. – Abion47

+0

Для вопроса №2 выражение лямбда не имеет типа, но оно может быть неявно преобразовано в делегат, если тип делегата может быть выведен. В этом случае тип делегата - 'Func '. –

ответ

2

Формы анонимных делегатов:

// A: C# 2.0... No one uses it in new developments since years 
delegate() { } 

// B: C# 3.0 and above 
() => { } 

W Могу ли я установить анонимного делегата для данного делегата?

Action a1 =() => Console.WriteLine("hello world"); 
Action<int> a2 = number => Console.WriteLine(number); 
Func<bool> f1 =() => true; 

Это называется делегат типа умозаключение.

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

В другой стороны, это не то же самое лямбда-выражение, чем делегата с лямбда-синтаксисом:

Expression<Action> expr1 =() => Console.WriteLine("hello world"); 
Action a1 =() => Console.WriteLine("hello world"); 

Первый является an expression tree, которая является структурой данных похожа на абстрактного синтаксического дерева, которые могут быть использованы для извлечения информации из epxression и ее дочерних элементов, а позже - делегата.

Деревья выражений могут быть скомпилированы в делегатов:

Action a2 = expr1.Compile(); 
a2(); 

читать дальше