библиотеки FCL - IComparable<T> и других. Введение универсальности, в первую очередь, сказалось на библиотеке FCL - внутренних классов, определяющих поведение системы. В частности, для большинства интерфейсов появились универсальные двойники с параметрами. Если бы в наших примерах мы использовали не универсальный интерфейс, а обычный, то потеряли бы в эффективности, поскольку сравнение объектов потребовало бы создание временных объектов типа object, выполнения операций boxing и unboxing. Универсальные делегаты Делегаты также могут иметь родовые параметры. Чаще встречается ситуация, когда делегат объявляется в универсальном классе и использует в своем объявлении параметры универсального класса. Давайте рассмотрим ситуацию с делегатами более подробно. Вот объявление универсального класса, не очень удачно названного Delegate, в котором объявляется функциональный тип - delegate: class Delegate<T> { public delegate T Del(T a, T b); } Как видите, тип аргументов и возвращаемого значения в сигнатуре функционального типа определяется классом Delegate. Добавим в класс функцию высшего порядка FunAr, одним из аргументов которой будет функция типа Del, заданного делегатом. Эта функция будет применяться к элементам массива, передаваемого также функции FunAr. Приведу описание: public T FunAr(T[] arr, T a0, Del f) { T temp = a0; for(int i =0; i<arr.Length; i++) { temp = f(temp, arr[i]); } return (temp); } Эта универсальная функция с успехом может применяться для вычисления сумм, произведения, минимума и других подобных характеристик массива. Рассмотрим теперь клиентский класс Testing, в котором определен набор функций: public int max2(int a, int b) { return (a > b) ? a : b; } public double min2(double a, double b) |