Программирование >>  Обработка исключительных ситуаций 

1 ... 96 97 98 [ 99 ] 100 101 102 ... 142


Во вторую версию библиотеки .NET добавлены параметризованные коллекции для представления основных структур данных, применяющихся при создании программ, - стека, очереди, списка, словаря и т. д. Эти коллекции, расположенные в пространстве имен System.Collections.Generic, дублируют аналогичные коллекции пространства имен System.Collections, рассмотренные в разделе Пространство имен System.CoIlections (см. с. 295). В табл. 13.5 приводится соответствие между обычными и параметризованными коллекциями библиотеки .NET (параметры, определяющие типы данных, хранимых в коллекции, указаны в угловых скобках).

Таблица 13.5. Параметризованные коллекции библиотеки .NET версии 2.0

Класс-прототип (версия 2.0) Обгчный класс

Comparer< Comparer

Dictionary<K,T> HashTable

LinkedList<T>

List<T> ArrayList

Queue< Queue

SortedDi cti ona ry<K,T> SortedList

Stack<T> Stack

У коллекций, описанных в библиотеке .NET версий 1.0 и 1.1, есть два основных недостатка, обусловленных тем, что в них хранятся ссылки на тип object:

в одной и той же коллекции можно хранить элементы любого типа, следовательно, ошибки при помещении в коллекцию невозможно проконтролировать на этапе компиляции, а при извлечении элемента требуется его явное преобразование;

при хранении в коллекции элементов значимых типов выполняется большой объем действий по упаковке и распаковке элементов, что в значительной степени снижает эффективность работы.

Параметром класса-прототипа является тип данных, с которым он работает. Это избавляет от перечисленных недостатков. В качестве примера рассмотрим применение универсального двойника класса ArrayLi st - класса List<T> - для хранения коллекции объектов классов Monster и Daemon, которые разрабатывались в главах 5 и 8, а также для хранения целых чисел1.

Листинг 13.2. Использование универсальной коллекции List<T> using System;

using System.Collections.Generic; using System.Text:

Полное описание этих классов приведено в разделе Создание библиотеки (см. с. 275)



foreach ( int x in lint ) Console.WriteC x + );

Результат работы программы:

Monster Monia health = 100 ammo = 100

Monster Monk health = 100 ammo = 100

Daemon Dimon health = 100 ammo = 100 brain = 3

1 3 5

В листинге 13.2 две коллекции. Первая (stado) содержит элементы пользовательских классов, которые находятся в библиотеке MonsterL.ib.clll, созданной в предыдущей главе. В коллекции, для которой объявлен тип элементов Monster, благодаря полиморфизму можно хранить элементы любого производного класса, но не элементы других типов.

Казалось бы, по сравнению с обычными коллекциями это ограничение, а не универсальность, однако на практике коллекции, в которых действительно требуется хранить значения различных, не связанных межу собой типов, почти не используются. Достоинством же такого ограничения является то, что компилятор может выполнить контроль типов во время компиляции, а не выполнения программы, что повышает ее надежность и упрощает поиск ошибок.

Коллекция 1 i nt состоит из целых чисел, причем для работы с ними не требуются ни операции упаковки и распаковки, ни явные преобразования типа при получении элемента из коллекции, как это было в обычных коллекциях (см. листинг 13.1).

Классы-прототипы называют также родовыми или шаблонными, поскольку они представляют собой образцы, по которым во время выполнения программы

namespace ConsoleAppl icationi

using MonsterLib; class Program

static void MainO

List<Monster> stado = new List<Monster>(); stado.Add( new MonsterC Monia ) ); stado.Add( new MonsterC Monk ) ); stado.AddC new Daemon ( Dimon , 3 ) ); foreach ( Monster x in stado ) x.PassportO;

List<int> lint = new List<int>();

lint.AddC 5 ); lint.AddC 1 ); lint.AddC 3 );

lint.SortO;

int a = lint[2];

Console.WriteLineC a );



В листинге 13.3 приведен еще один пример применения параметризованных коллекций. Программа считывает содержимое текстового файла, разбивает его на слова и подсчитывает количество повторений каждого слова в тексте. Для хранения слов и числа их повторений используется словарь Dictionary<T,K> . У этого класса два параметра: тип ключей и тип значений, хранимых в словаре. В качестве ключей используются слова, считанные из файла, а значения представляют собой счетчики целого типа, которые увеличиваются на единицу, когда слово встречается в очередной раз.

Листинг 13.3. Формирование частотного словаря using System:

using System.Collections.Generic;

using System.Text;

using System.10;

namespace ConsoleApplicationl

class Program

{ static void MainO

StreamReader f = new StreamReader( @ d:\C#\text.txt ); 1

string s = f.ReadToEndO; 2

char[] separators = { , ! }; 3

List<string> words = new List<string>( s.Split(separators) ); 4 Dictionary<string, int> map = new Dictionary<string. int>(); 5

foreach ( string w in words ) 6

if ( map.ContainsKeyC w ) ) map[w]++; else map[w] = 1;

foreach ( string w in map.Keys ) 7

Console.WriteLineC {0}\t{l} , w. map[w] );

строятся конкретные классы. При этом сведения о классах, которые являются параметрами классов-прототипов, извлекаются из метаданных.

ВНИМАНИЕ-

Использование стандартных параметризованных коллекций для хранения и обработки данных является хорошим стилем программирования, поскольку позволяет сократить сроки разработки программ и повысить их надежность. Рекомендуется тщательно изучить по документации свойства и методы этих классов и выбирать наиболее подходящие в зависимости от решаемой задачи.



1 ... 96 97 98 [ 99 ] 100 101 102 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика