Запутался в типах Func, Delegates и Anonymous

Читая эту строку примера кода из книги:

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

Console.WriteLine(returnLength("Hello"));

Это говорит

Func<string,double,int> эквивалентен типу делегата формы public delegate int SomeDelegate(string arg1, double arg2)

Итак, Func является делегатом? Тогда что это за делегат, который мы снова определили в примере кода? Мы определяем переменную из Func, которая похожа на delegate, а затем снова присваиваем ее другому delegate? Я очень смущен и не могу понять эту концепцию. :(

Может ли кто-нибудь объяснить это?


person Community    schedule 02.01.2014    source источник
comment
Func — это делегат с некоторым возвращаемым типом.   -  person dotNETbeginner    schedule 02.01.2014
comment
Я не вижу никакого анонимного типа в вашем коде.   -  person MarcinJuraszek    schedule 02.01.2014
comment
@MarcinJuraszek: returnLength назначается анонимным делегатом. OP сбит с толку и вместо этого использовал термин анонимный type.   -  person Gabe    schedule 02.01.2014
comment
@ Гейб Хорошо, теперь я вижу. Но чтобы быть на 100% правильным, вещь, о которой он говорит, называется анонимным методом, а не анонимным делегатом. См. MSDN: msdn.microsoft.com/en-us/library/0yw3tz5k.aspx   -  person MarcinJuraszek    schedule 02.01.2014


Ответы (4)


Значит, Func является делегатом?

Да, он определяется следующим образом:

public delegate TResult Func<in T, out TResult>(T arg)

Это описано как:

Инкапсулирует метод, который имеет один параметр и возвращает значение типа, указанного параметром TResult.

Прочтите Func Delegate, чтобы узнать больше.

Тогда что это за делегат, который мы снова определили в примере кода?

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

Мы определяем переменную из Func, которая похожа на делегат, а затем снова назначаем ее другому делегату?

Нет, мы создаем переменную с типом Func<string, int>, а затем создаем делегат, соответствующий этому типу, и присваиваем его переменной.


Дополнительные источники из MSDN:

person MarcinJuraszek    schedule 02.01.2014

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

Func<string,int> returnLength = (s) => {return s.Length;}

назначение делегата Func аналогично назначению переменной другому..

person dotNETbeginner    schedule 02.01.2014

Да, Func эквивалентен типу delegate с возвращаемым типом. Определенный вами delegate — это delegate, который выполняется при вызове метода, возвращающего тип int.

Это можно сократить до

Func<string, int> returnLength = (text) => { return text.length; };

В этой ситуации делегат возвращает тип значения int (Int32)

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

Action<string> action = delegate(string text) { text = ""; };

or

Action<string> action = (text) => { text = ""; };

Теперь анонимные типы сильно отличаются от delegate, Action или Func. Теперь Func и Action были реализованы в .Net 3.5 после введения делегатов.

person Nico    schedule 02.01.2014

Ваш код также может быть выражен следующим образом:

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

Console.WriteLine(returnLength("Hello"));

Функция является делегатом.

  1. Func<string, int> - это объявление,
  2. delegate (string text) { return text.Length; } is the function that you are assigning.
    1. This delegate (function) accepts a string (string text) and returns an integer (return text.Length;).

Это вернет 5 в качестве текста. Длина "Hello" равна 5. В этом примере вы не создаете двух делегатов, а просто назначаете одного.

person crthompson    schedule 02.01.2014