Оба варианта используются с целью возвращения значения, оба могут принимать несколько параметров. В чем между ними разница?
Ответ
Ну, есть ключевое слово delegate — это описание сигнатуры функции, т. е., её списка параметров и типа возвращаемого значения. Используется так:
public delegate bool MyPredicate(int x);
Им можно пользоваться так:
private bool IsOdd(int i) { return i % 2 != 0; }
private Analyze(MyPredicate p, int x)
{
bool result = p(x);
if (result)
Console.WriteLine("found!");
}
Analyze(IsOdd, 1); // печатает "found!"
С другой стороны, есть готовые, предопределённые сигнатуры функций (Func
private bool IsOdd(int i) { return i % 2 != 0; }
private Analyze(Func
Analyze(IsOdd, 1); // печатает "found!"
Если для вашей сигнатуры подходит Func или Action, особого смысла определять свой делегат нету. Или есть, если вы хотите дать своему делегату более подходящее имя, чем просто Func, и хотите подчеркнуть его семантику
Существуют случаи, когда свой делегат всё же необходимо объявлять. Например, наличие out- и ref-параметров:
public delegate Updater(ref int x); // невозможно выразить через Func
Для полноты, вот (надеюсь, полный) список вариантов, когда вам придётся объявлять делегат:
Когда список аргументов чересчур длинный (для .NET 4+ более 16 аргументов, для .NET 3.5 больше 4 аргументов)
Когда ваши аргументы содержат ref, out или params
Если ваш делегат рекурсивен (например delegate D D(D d)). Как ни странно, такие штуки иногда нужны
Комментариев нет:
Отправить комментарий