Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
// возвращает void и принимает единственный параметр типа Т.
public delegate void MyGenericDelegate<T>(T arg);
Как видите, в типе делегата
MyGenericDelegate<T>
string
// Создать экземпляр MyGenericDelegate<T>
// с указанием string в качестве параметра типа.
MyGenericDelegate<string> strTarget = StringTarget;
strTarget("Some string data");
С учетом формата объекта
strTarget
StringTarget
static void StringTarget(string arg)
{
Console.WriteLine(
"arg in uppercase is: {0}", arg.ToUpper());
}
Обобщенные делегаты Action<> и Func<>
В настоящей главе вы уже видели, что когда нужно применять делегаты для обратных вызовов в приложениях, обычно должны быть выполнены описанные далее шаги.
1. Определить специальный делегат, соответствующий формату метода, на который он указывает.
2. Создать экземпляр специального делегата, передав имя метода в качестве аргумента конструктора.
3. Косвенно обратиться к методу через вызов
Invoke()
В случае принятия такого подхода в итоге, как правило, получается несколько специальных делегатов, которые могут никогда не использоваться за рамками текущей задачи (например,
MyGenericDelegate<T>
CarEngineHandler
void
Action<>
Func<>
ActionAndFuncDelegates
Обобщенный делегат
Action<>
System
void
Action<>
Модифицируйте класс
Program
// Это цель для делегата Action<>.
static void DisplayMessage(string msg, ConsoleColor txtColor,
int printCount)
{
// Установить цвет текста консоли.
ConsoleColor previous = Console.ForegroundColor;
Console.ForegroundColor = txtColor;
for (int i = 0; i < printCount; i++)
{
Console.WriteLine(msg);
}
// Восстановить цвет.
Console.ForegroundColor = previous;
}
Теперь вместо построения специального делегата вручную для передачи потока программы методу
DisplayMessage()
Action<>
Console.WriteLine("***** Fun with Action and Func *****");
<b>// Использовать делегат Action<> для указания на метод DisplayMessage().</b>
Action<string, ConsoleColor, int> actionTarget =
DisplayMessage;
actionTarget("Action Message!", ConsoleColor.Yellow, 5);
Console.ReadLine();
Как видите, при использовании делегата
Action<>
Action<>
void
Func<>
Обобщенный делегат
Funс<>
Action<>
Program
// Цель для делегата Func<>.
static int Add(int x, int y)
{
return x + y;
}
Ранее в главе был построен специальный делегат
BinaryOp
Func<>
Func<>
Program