|
Программирование >> Обработка исключительных ситуаций
Во вторую версию библиотеки .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] ); строятся конкретные классы. При этом сведения о классах, которые являются параметрами классов-прототипов, извлекаются из метаданных. ВНИМАНИЕ- Использование стандартных параметризованных коллекций для хранения и обработки данных является хорошим стилем программирования, поскольку позволяет сократить сроки разработки программ и повысить их надежность. Рекомендуется тщательно изучить по документации свойства и методы этих классов и выбирать наиболее подходящие в зависимости от решаемой задачи.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |