Глава 12. Коллекции. Обобщения
287
к другим, использованием типа
object
в качестве промежуточного типа
и т. д.) в коллекции могут оказаться данные не того типа, с которым
должна работать коллекция. Кроме того, приведение данных связано с
выполнением операций по упаковке/распаковке данных, что занимает
значительное дополнительное время. (Упаковка данных — это процесс
преобразования значения данного в ссылку на него и возможное пере-
мещение данного из стековой памяти программы в кучу, где хранятся
ссылочные данные; а распаковка — это обратный процесс: преобразо-
вание ссылки на данное в значение данного, и такое данное уже не мо-
жет храниться в куче. Его надо перемещать в стековую память про-
граммы.) Возникает проблема типизации коллекций, задание типа дан-
ных, с которыми (и только с ними) может работать коллекция. Но тогда
каждый раз для нового типа данных надо будет создавать заново новый
класс. Человечество всегда на пути своего развития стремилось к обоб-
щениям. Вот и в данном случае первое, что приходит в голову: а нельзя
ли как-то параметризировать процесс создания класса? Сделать так,
чтобы параметром класса был тип данного? И этот тип конкретизиро-
вался на этапе создания экземпляра класса, позволяя создавать объект
строго типизированным? Эту проблему как раз и решают средства C#,
которые называются
обобщениями
. Для этого было создано специаль-
ное пространство
System.Collection.Generic
, в котором и размещаются
такие классы. Но обобщенными классами дело не ограничивается:
обобщенными можно создавать интерфейсы (хотя это тоже классы, но
без возможности их наследования) и методы, которые можно опреде-
лять и не в обобщенных классах. Обобщенный элемент отличить от
других элементов в документации .NET Framework легко по наличию
угловых скобок с буквой или другой лексемой (лексема — последо-
вательность допустимых символов, которую распознает компилятор)
в них. Например, мы встречались уже с классом
List
. Конструкцию
<Т>
можно читать как "типа Т".
Т
— это место подстановки настоящего
типа данных при объявлении экземпляра "типизированного" класса.
Например, коллекция целых чисел, полученная с применением обоб-
щенного класса
List
, может быть объявлена так:
List MyInt = new List();
Имя параметра типа может быть не обязательно "Т". Это имя задает тот,
кто создает обобщенный элемент и создает для него документацию.
Обычно в качестве имени могут быть для представления типов —
Т
, для
представления ключей —
K
,
Key
, для представления значений —
V
или
TValue
.
Итак, значение параметра должно быть явно указано при создании объ-
екта из обобщенного элемента. Ранее мы встречались уже с применени-
288
Do'stlaringiz bilan baham: |