Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Пример 1. Параметризированные коллекции
Лабораторная работа № 12. Параметризированные коллекции. Обработка исключительных ситуаций. Цель. Получить практические навыки работы со стандартными коллекциями пространства имен System.Collection.Generic и с нестандартными исключениями, создаваемыми программистм. Теоретические сведения Параметризированные коллекции. Во вторую версию библиотеки.NET добавлены параметризованные коллекции для представления основных структур данных, применяющихся при создании программ, — стека, очереди, списка, словаря и т. д. Эти коллекции, расположенные в пространстве имен System.Collections.Generic, дублируют аналогичные коллекции пространства имен System.Collections. Параметризованные коллекции библиотеки.NET
Параметром класса-прототипа является тип данных, с которым он работает (T – это тип, который является параметром коллекции, т. е. вместо него можно подставить любой другой тип данных). В коллекциях, которые мы рассматривали ранее, хранятся ссылки на объекты типа object. Когда значение структурного типа приводится к типу object (или к типу того интерфейса, который реализован системой) выполняется операция упаковки – явного преобразования из типа значений в тип ссылок. Эта операция выполняется автоматически и не требует вмешательства программиста. Обратной операцией является распаковка – значение объекта присваивается переменной. У таких коллекций есть два недостатка: ● в одной и той же коллекции можно хранить элементы любого типа, следовательно, ошибки при помещении в коллекцию невозможно проконтролировать на этапе компиляции, а при извлечении элемента требуется его явное преобразование; ● при хранении в коллекции элементов значимых типов выполняется большой объем действий по упаковке и распаковке элементов, что в значительной степени снижает эффективность работы. Пример 1. class Person: IComparable {.... } class Student: Person {.... } class Program { static void Main(string[] args) { List< Person> StudentGroup = new List< Person> (); //создали коллекцию StudentGroup.Add(new Student(" Иванов", 18, 1, 4)); StudentGroup.Add(new Student(" Петров", 19, 2, 5)); StudentGroup.Add(new Student(" Сидоров", 21, 5, 4.5)); StudentGroup.Add(new Person(" Семенов", 23)); Console.WriteLine(" Студенческая группа"); foreach (Person x in StudentGroup) x.Show(); List< int> Vector = new List< int> (); Vector.Add(1); Vector.Add(5); Vector.Add(4); Console.WriteLine(" \nВектор"); foreach (int y in Vector) Console.Write(y + " "); Console.WriteLine(); } }
Коллекция StudentGroup содержит объекты пользовательских классов иерархии классов Person-> Student. В коллекции, для которой объявлен тип элементов Person, благодаря полиморфизму можно хранить элементы любого производного класса, но не элементы других типов. Казалось бы, по сравнению с обычными коллекциями это ограничение, а не универсальность, однако на практике коллекции, в которых действительно требуется хранить значения различных, не связанных межу собой типов, почти не используются. Достоинством же такого ограничения является то, что компилятор может выполнить контроль типов во время компиляции, а не выполнения программы, что повышает ее надежность и упрощает поиск ошибок. Коллекция Vector состоит из целых чисел, причем для работы с ними не требуются ни операции упаковки и распаковки, ни явные преобразования типа при получении элемента из коллекции, как это было в обычных коллекциях. Классы-прототипы называют также родовыми или шаблонными, поскольку они представляют собой образцы, по которым во время выполнения программы строятся конкретные классы. Использование стандартных параметризованных коллекций для хранения и обработки данных является хорошим стилем программирования, поскольку позволяет сократить сроки разработки программ и повысить их надежность. Рекомендуется тщательно изучить по документации свойства и методы этих классов и выбирать наиболее подходящие в зависимости от решаемой задачи.
|