Я вижу делегатов в двух формах:
A. Func<string, string> convertMethod = lambda
B. public delegate string convertMethod(string value);
Я не уверен, в чем на самом деле разница между этими двумя. Они оба делегаты? Я считаю, что первый будет использовать лямбду, а второй должен иметь метод для фактического выполнения работы. Я тоже могу запутаться.
Ответы:
Прежде всего, ваши два примера делают две совершенно разные вещи. Первый - это объявление общей переменной-делегата и присвоение ей значения, второй - просто определение
delegate
типа. Ваш пример, более полный, будет:public static class Program { // you can define your own delegate for a nice meaningful name, but the // generic delegates (Func, Action, Predicate) are all defined already public delegate string ConvertedMethod(string value); public static void Main() { // both work fine for taking methods, lambdas, etc. Func<string, string> convertedMethod = s => s + ", Hello!"; ConvertedMethod convertedMethod2 = s => s + ", Hello!"; } }
Но что более важно, оба
Func<string,string>
иdelegate string convertMethod(string)
могут содержать одни и те же определения методов, будь то методы, анонимные методы или лямбда-выражения.То, что вам следует использовать, зависит от ситуации. Если вы хотите, чтобы ваш делегат больше определялся тем, что он принимает и возвращает, тогда универсальные делегаты идеально подходят. Если вы хотите , делегат иметь некоторое специальное название , которое дает больше определения того , что что делегат должен делать (помимо простого
Action
,Predicate
и т.д.) , то создавая свой собственный делегат всегда вариант.источник
Func<int, string>
, который показывает, что форма естьFunc<arg1, result>
.Образец кода, который у вас есть, немного сбивает с толку, поэтому позвольте мне попытаться прояснить его. Следующие 2 элемента являются объявлениями делегатов. Их легко обнаружить, потому что они всегда будут содержать
delegate
ключевое словоpublic delegate TReturn Func<TArg, TReturn>(Targ value); public delegate string convertMethod(string value);
Эта строка кода присваивает значение локальному объекту, который вводится делегату.
Func<string, string> local = lambda;
Однако приведенный выше код не ограничивается использованием только лямбда-выражений. Значением также может быть совместимая группа методов или другое значение делегата.
Еще один момент, на который следует обратить внимание, заключается в том, что хотя
Func<string, string>
иconvertMethod
оба являются делегатами с одинаковыми подписями, их значения не могут быть преобразованы друг в друга. Например, следующее недопустимоFunc<string, string> local1 = ...; convertMethod local2 = local1; // Error!!!
источник
Из MSDN ,
и
Вас также может заинтересовать этот SO-ответ по ключевому слову делегата и лямбда-выражению .
Кроме того, в MSDN есть хорошая статья о лямбда-выражениях :
delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 }
источник
A инициализирует экземпляр делегата (который может быть вызван немедленно). Это переменная типа Func <string, string>.
B указывает определение делегата (его подпись). Его можно использовать для определения переменных типа convertMethod .
источник