Да, Delegate
и Action
отличаются, хотя и связаны между собой. Разберем различия подробно.
// Иерархия наследования
System.Object
└── System.Delegate
└── System.MulticastDelegate
└── Action, Func, другие делегаты
Характеристика | Delegate | Action |
---|---|---|
Тип | Абстрактный базовый класс | Конкретный sealed-класс |
Объявление | Требует явного объявления типа | Готовый шаблон (не требуется объявлять) |
Возвращаемое значение | Может быть любым | Всегда void |
Параметры | Задаются при объявлении | От 0 до 16 параметров (Action<T1,...,T16>) |
Использование | Низкоуровневые операции | Повседневное использование |
// 1. Объявляем тип делегата
public delegate void LogMessage(string message);
// 2. Создаем экземпляр
LogMessage logger = msg => Console.WriteLine(msg);
logger("Using custom delegate");
// Не требуется объявлять тип - используем готовый Action
Action<string> logger = msg => Console.WriteLine(msg);
logger("Using Action<T>");
Используйте явные Delegate когда:
Используйте Action когда:
Action - это фактически набор предопределенных делегатов:
public delegate void Action();
public delegate void Action<in T>(T obj);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
// ... и так до 16 параметров
Delegate позволяет низкоуровневые операции:
// Динамическое создание делегатов
var method = typeof(Console).GetMethod("WriteLine", new[] { typeof(string) });
var delegate = Delegate.CreateDelegate(typeof(Action<string>), method);
Все Action
являются делегатами, но не все делегаты являются Action
:
Action<string> action = Console.WriteLine;
Delegate delegate = action; // Можно присвоить
// Обратное преобразование требует приведения типа
if (delegate is Action<string>)
{
Action<string> newAction = (Action<string>)delegate;
}
Delegate
- это базовый механизм работы с методами как с объектами, тогда как Action
- это удобный готовый шаблон для часто используемого случая (методы без возвращаемого значения). Выбор между ними зависит от конкретной задачи: для простых случаев подойдет Action
, для специализированных сценариев может потребоваться создание собственных типов делегатов через delegate
ключевое слово.