Обобщенные делегаты
57C# --- Руководство по C# --- Обобщенные делегаты
Как и методы, делегаты также могут быть обобщенными. Ниже приведена общая форма объявления обобщенного делегата:
delegate возвращаемый_тип имя_делегата<список_параметров_типа>(список_аргументов);
Обратите внимание на расположение списка параметров типа. Он следует непосредственно после имени делегата. Преимущество обобщенных делегатов заключается в том, что их допускается определять в типизированной обобщенной форме, которую можно затем согласовать с любым совместимым методом.
Обобщенные делегаты предоставляют более гибкий способ спецификации метода, подлежащего вызову в безопасной к типам манере. До появления обобщений (в .NET 2.0) того же конечного результата можно было достичь с использованием параметра System.Object:
public delegate void MyDelegate(object arg);
Хотя это позволяет посылать любой аргумент цели делегата, это не обеспечивает безопасность типов и не избавляет от необходимости упаковки/распаковки. Давайте рассмотрим пример применения обобщенных делегатов:
using System;
namespace ConsoleApplication1
{
// Создадим обобщенный делегат
delegate T MyDel<T> (T obj1, T obj2);
class MySum
{
public static int SumInt(int a, int b)
{
return a + b;
}
public static string SumStr(string s1, string s2)
{
return s1 + " " + s2;
}
public static char SumCh(char a, char b)
{
return (char)(a + b);
}
}
class Program
{
static void Main()
{
// Реализуем несколько методов обобщенного делегата
MyDel<int> del1 = MySum.SumInt;
Console.WriteLine("6 + 7 = " + del1(6,7));
MyDel<string> del2 = MySum.SumStr;
Console.WriteLine("\"Отличная\" + \"погода\" = " + del2("Отличная","погода"));
MyDel<char> del3 = MySum.SumCh;
Console.WriteLine("'a' + 'c' = " + del3('a','c'));
Console.ReadLine();
}
}
}