Прежде всего, ваши два примера делают две совершенно разные вещи.Первый - объявление универсальной переменной-делегата и присвоение ей значения, второй - просто определение типа 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
и т. Д.), Тогда создание собственного делегата всегда является опцией.