Тверской государственный университет
Опубликован: 02.12.2009 | Доступ: свободный | Студентов: 2460 / 324 | Оценка: 4.47 / 4.24 | Длительность: 14:45:00
Лекция 9:

Универсальность. Классы с родовыми параметрами

Framework .Net и универсальность

Универсальность принадлежит к основным механизмам языка. Ее введение в язык C# не могло не сказаться на всех его основных свойствах. Как уже говорилось, классы и все частные случаи стали обладать этим свойством. Введение универсальности не должно было ухудшить уже достигнутые свойства языка - статический контроль типов, динамическое связывание и полиморфизм. Не должна была пострадать и эффективность выполнения программ, использующих универсальные классы.

Решение этих задач потребовало введения универсальности не только в язык C#, но и поддержки на уровне каркаса Framework .Net и языка IL, включающем теперь параметризованные типы. Универсальный класс C# не является шаблоном, на основе которого строится конкретизированный класс, компилируемый далее в класс (тип) IL. Компилятору языка C# нет необходимости создавать классы для каждой конкретизации типов универсального класса. Вместо этого происходит компиляция универсального класса C# в параметризованный тип IL. Когда же CLR занимается исполнением управляемого кода, то вся необходимая информация о конкретных типах извлекается из метаданных, сопровождающих объекты.

При этом дублирования кода не происходит и на уровне JIT-компиляторов, которые, однажды сгенерировав код для конкретного типа, сохраняют ссылку на этот участок кода и передают ее, когда такой код понадобится вторично. Это справедливо как для ссылочных, так и для значимых типов.

Естественно, что универсальность потребовала введения в библиотеку FCL соответствующих классов, интерфейсов, делегатов и методов классов, обладающих этим свойством.

Так, например, в класс System.Array добавлен ряд универсальных статических методов. Вот один из них:

public static int BinarySearch<T>(T[] array, T value);

В табл. 8.1 показаны некоторые универсальные классы и интерфейсы библиотеки FCL 2.0 из пространства имен System.Collections.Generic и их аналоги из пространства System.Collections.

Таблица 8.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

Проекты

  1. Постройте DLL с классом Sorting, содержащим различные методы сортировки. Методы должны быть универсальными и позволять сортировать объекты разных типов - персоны, машины, числа, строки. Методы должны быть функциями высших порядков, допускающими сортировать данные типа T по разным критериям, например, сортировать машины по маркам, по номерам, по фамилиям владельцев. В Windows-проекте постройте классы Person, Car и другие классы, демонстрирующие работу с классом Sorting. В клиентском классе предусмотрите построение набора функций, позволяющих сравнивать персон по разным критериям. Предусмотрите возможность задания таких функций лямбда-выражениями. В интерфейсе проекта предусмотрите возможность сравнения методов сортировки по времени. Постройте метод, вычисляющий время сортировки, как функцию высшего порядка, которой передается в качестве аргумента метод сортировки.
  2. Постройте DLL, включающую собственные аналоги библиотечных классов Stack<T>, Queue<T>, List<T>. Постройте Windows-проект для работы с этими классами.
  3. Постройте DLL, включающую собственные аналоги библиотечных классов List<T>, LinkedList<T>. Постройте Windows-проект для работы с этими классами.
  4. Постройте DLL, включающую собственные аналоги библиотечных классов Dictionary<K, T>, SortedDictionary<K, T>. Постройте Windows-проект для работы с этими классами.
  5. Постройте DLL, включающую класс BinaryTreeSearch<K, T> - бинарное дерево поиска. Элементы, хранимые в дереве, обладают ключом типа K и информационным полем типа T. Ключи элементов уникальны. Для дерева поиска справедливо свойство: Ключ элемента, хранимого в корне дерева, больше ключей всех элементов, хранимых в левом поддереве, и меньше ключей всех элементов, хранимых в правом поддереве. Постройте Windows-проект для работы с этим классом.
  6. (**) Постройте DLL с классами, реализующими сбалансированные бинарные деревья поиска - идеально сбалансированные деревья, АВЛ - деревья, красно-черные деревья. Постройте Windows-проект для работы с этим классом. Проект должен позволять оценить время работы на одних и тех же данных при использовании разных типов деревьев.
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?