- •Тема 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  | 
		
  | 
	|
Сериализация и универсализация также согласуются друг с другом, так что можно иметь универсальный класс, для которого задан атрибут сериализации.
	 
		
