Прежде всего, ваши два примера делают две совершенно разные вещи. Первый - это объявление общей переменной-делегата и присвоение ей значения, второй - просто определение delegate
типа. Ваш пример, более полный, будет:
public static class Program
{
public delegate string ConvertedMethod(string value);
public static void Main()
{
Func<string, string> convertedMethod = s => s + ", Hello!";
ConvertedMethod convertedMethod2 = s => s + ", Hello!";
}
}
Но что более важно, оба Func<string,string>
и delegate string convertMethod(string)
могут содержать одни и те же определения методов, будь то методы, анонимные методы или лямбда-выражения.
То, что вам следует использовать, зависит от ситуации. Если вы хотите, чтобы ваш делегат больше определялся тем, что он принимает и возвращает, тогда универсальные делегаты идеально подходят. Если вы хотите , делегат иметь некоторое специальное название , которое дает больше определения того , что что делегат должен делать (помимо простого Action
, Predicate
и т.д.) , то создавая свой собственный делегат всегда вариант.