Обобщенные делегаты
Как и методы, делегаты также могут быть обобщенными. Ниже приведена общая форма объявления обобщенного делегата:
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(); } } }
Комментарии