Обобщенные делегаты

57

Как и методы, делегаты также могут быть обобщенными. Ниже приведена общая форма объявления обобщенного делегата:

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();
        }
    }
}
Использование обобщенных делегатов C#
Пройди тесты
Лучший чат для C# программистов