
- •Тема 2.8. Виртуальные функции в c#
- •Что такое «Виртуальные функции»?
- •Как объявляются виртуальные функции?
- •Абстрактные функции и абстрактные классы
- •Модификатор sealed
- •Реализация виртуального механизма
- •Тема 2_09. Универсальные (параметризованные) классы. Шаблоны
- •Наследование и универсальность
- •Синтаксис универсального класса
- •Класс с универсальными методами
- •Два основных механизма объектной технологии
- •Ограниченная универсальность
- •Синтаксис ограничений
- •Framework .Net и универсальность
Framework .Net и универсальность
Компилятору языка C# нет необходимости создавать классы для каждой конкретизации типов универсального класса. Вместо этого происходит компиляция универсального класса C# в параметризованный тип промежуточного языка IL. Когда же CLR занимается исполнением управляемого кода, то вся необходимая информация о конкретных типах извлекается из метаданных, сопровождающих объекты.
При этом дублирования кода не происходит и на уровне JIT-компиляторов, которые, однажды сгенерировав код для конкретного типа, сохраняют ссылку на этот участок кода и передают ее, когда такой код понадобится вторично. Это справедливо как для ссылочных, так и значимых типов.
Естественно, что универсальность потребовала введения в библиотеку FCL соответствующих классов, интерфейсов, делегатов и методов классов, обладающих этим свойством.
Так, например, в класс System.Array добавлен ряд универсальных статических методов. Вот один из них:
public static int BinarySearch<T>(T[] array, T value);
В таблице 22.1 показаны некоторые универсальные классы и интерфейсы библиотеки FCL 2.0 из пространства имен System.Collections.Generic и их аналоги из пространства System.Collections.
Таблица 22.1. Соответствие между универсальными классами и их обычными двойниками |
|||
Универсальный класс |
Обычный класс |
Универсальный интерфейс |
Обычный интерфейс |
Comparer<T> |
Comparer |
ICollection<T> |
ICollection |
Dictionary<K,T> |
HashTable |
IComparable<T> |
IComparable |
LinkedList<T> |
---- |
IDictionary<K,T> |
IDictionary |
List<T> |
ArrayList |
IEnumerable<T> |
IEnumerable |
Queue<T> |
Queue |
IEnumerator<T> |
IEnumerator |
SortedDictionary<K,T> |
SortedList |
IList<T> |
IList |
Stack<T> |
Stack |
|
Сериализация и универсализация также согласуются друг с другом, так что можно иметь универсальный класс, для которого задан атрибут сериализации.