компиляции, является главным преимуществом обобщений. Несмотря на то что в 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);
}
}
Эта программа дает следующий результат.