компиляции, является главным преимуществом обобщений. Несмотря на то что в C# всегда имелась возможность создавать "обобщенный" код, используя ссылки на объекты, такой код не был типизированным, т.е. не обеспечивал типовую безопасность, а его неправильное применение могло привести к исключительным ситуациям во время выполнения. Подобные ситуации исключаются благодаря обобщениям. По существу, обобщения переводят ошибки при выполнении в разряд ошибок при компиляции. В этом и заключается основная польза от обобщений.
В рассматриваемой здесь необобщенной версии программы имеется еще один любопытный момент. Обратите внимание на то, как тип переменнойobэкземпляра классаNonGenсоздается с помощью методаShowType() в следующей строке кода.
Console.WriteLine("Тип переменной ob: " + ob.GetType ());
Как пояснялось в главе 11, в классеobjectопределен ряд методов, доступных для всех типов данных. Одним из них является методGetType (), возвращающий объект классаТуре,который описывает тип вызывающего объекта во время выполнения. Следовательно, конкретный тип объекта, на который ссылается переменнаяob,становится известным во время выполнения, несмотря на то, что тип переменнойobуказан в исходном коде какobject.Именно поэтому в среде CLR будет сгенерировано исключение при попытке выполнить неверное приведение типов во время выполнения программы.
Обобщенный класс с двумя параметрами типа
В классе обобщенного типа можно указать два или более параметра типа. В этом случае параметры типа указываются списком через запятую. В качестве примера ниже приведен классTwoGen,являющийся вариантом классаGenс двумя параметрами типа.
// Простой обобщенный класс с двумя параметрами типа Т и V.
using System;
class TwoGenCT, V> {
T obi;
V ob2;
// Обратите внимание на то, что в этом конструкторе // указываются параметры типа Т и V. public TwoGen(Т ol, V о2) {
obi = ol; оЬ2 = о2;
}
// Показать типы Т и V. public void showTypes() {
Console.WriteLine("К типу T относится " + typeof(Т));
Console.WriteLine("К типу V относится " + typeof(V));
}
return obi;
}
public V Get0bj2() { return ob2;
}
}
// Продемонстрировать применение обобщенного класса с двумя параметрами типа, class SimpGen {
static void Main() {
TwoGenCint, string> tgObj =
new TwoGenCint, string>(119, "Альфа Бета Гамма");
// Показать типы. tgObj.showTypes();
// Получить и вывести значения, int v = tgObj.getobl();
Console.WriteLine("Значение: " + v); string str = tgObj.GetObj2();
Console.WriteLine("Значение: " + str);
}
}
Эта программа дает следующий результат.