Шаг 267.
Язык программирования C#. Начала.
Обобщенные типы. Ограничения на параметры типа (окончание)

    На этом шаге мы рассмотрим задание ограничений на обобщенные параметры в обобщенных делегатах и методах.

    Еще один пример иллюстрирует, как ограничения на обобщенные параметры реализуются в случае использования обобщенных делегатов и методов.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr267_1
{
    // Обобщенный делегат с ограничением
    // на обобщенный параметр:
    delegate T MD<T>(T[] arg) 
    where T: struct;
    // Главный класс: 
    class Program
    {
        // Статический обобщенный метод с ограничением на 
            // обобщенный параметр: 
            static T First<T>(T[] t) where T: struct{ 
                return t[0]; 
            }
        // Статический обобщенный метод (без ограничений на 
        // обобщенный параметр): 
        static T Last<T>(T[] t){ 
            return t[t.Length - 1];
        }
        // Обычный (не обобщенный) статический метод: 
        static int MaxVal(int[] a){ 
            int val = a[0];
            for(int k = 1; k < a.Length; k++) {
                if (val < a[k]) val = a[k];
            }
            return val;
        }
        // Главный метод:
        static void Main()
        {
            // Создание экземпляров делегата:
            MD<int> A = First<int>;
            MD<char> B = Last;
            MD<int> C = MaxVal;
            // Вызов экземпляров делегата: 
            int x = A(new int[]{10, 7, 3, 1}); 
            char y = B(new char[]{ 'A', 'C', 'F'}); 
            int z = C(new int[]{1, 7, 2, 5, 11, 9, 3, 6});
            // Проверка результата:
            Console.WriteLine("Значение: {0}, {1} и {2}", x, y, z);
            // Задержка:
            Console.ReadLine();
        }
    }
}

Архив проекта можно взять здесь.

    Ниже показано, как выглядит результат выполнения программы:


Рис.1. Результат работы приложения

   

    В данном случае мы описываем обобщенный делегат MD с одним обобщенным параметром (обозначен как T). На обобщенный параметр накладывается ограничение where T: struct, то есть параметром может быть нессылочный тип. Делегат соответствует методам, у которых аргумент является массивом, а результат - значением того же типа, что и элементы массива. Также в программе есть три статических метода: два обобщенных и один обычный (не обобщенный). Обобщенный метод First() результатом возвращает значение первого элемента массива, переданного аргументом методу На обобщенный параметр метода накладывается такое же ограничение, как и на параметр обобщенного делегата. Обобщенный метод Last() результатом возвращает значение последнего элемента массива, переданного аргументом методу (на обобщенный параметр метода ограничения не накладываются). Наконец, аргументом методу MaxVal() передается целочисленный массив, а результатом возвращается значение наибольшего элемента в массиве.

    В главном методе на основе статических методов создаются экземпляры для обобщенного делегата MD, причем при присваивании экземпляру ссылки на обобщенный метод последний мы указываем как с явной спецификацией значения обобщенного типа (команда

  MD<int> A = First<int>;
), так и без нее (команда
  MD<char> B = Last;
). При создании экземпляра делегата на основе обычного (не обобщенного) метода значение для обобщенного параметра указывается только после названия делегата (команда
  MD<int> C = MaxVal;
). Конечно, характеристики такого метода должны соответствовать характеристикам делегата. Также в главном методе есть примеры вызова созданных экземпляров делегата MD.

    На следующем шаге мы подведем итог изученному материалу.




Предыдущий шаг Содержание Следующий шаг