Г. Шилдт - С#4.0 Полное руководство (1160795), страница 186
Текст из файла (страница 186)
Так, при вызове метода Ы1с)гРедгееОЕРага11е11ввг () можно указать максимальное количество процессоров, выделяемых для обработки запроса, а при вызове метода Азэег(иепс1а1 () — запросить последовательное выполнение части параллельного запроса. Если вызывающий поток, ожидающий результатов от цикла Еогеас)г, не требуется блокировать, то для этой цели можно воспользоваться методом ГогА11 () . Все эти методы определены в классе Рага11е1ЕпоглегаЬ1е.
А в тех случаях, когда РЫ)Щ должен по умолчанию поддерживать последовательное выполнение, можно воспользоваться методом И1С)гЕхесиС1опиос)е (), передав ему в качестве параметра признак Рага11е1ЕхесцС1опМос(е. ГогсеРага11е11зи. Вопросы эффективности РИМО Далеко не все запросы выполняются быстрее только потому, что они распараллелены. Как пояснялось ранее в отношении ТР1., издержки, связанные с созданием параллельных потоков и управлением их исполнением, могут "перекрыть" все преимущества, которые дает распараллеливание.
Вообще говоря, если источник данных оказывается довольно мелким, а требующаяся обработка данных — очень короткой, то внедрение параллелизма может и не привести к ускорению обработки запроса. Поэтому за рекомендациями по данному вопросу следует обращаться к информации корпорации М(сгово((. 924 Часть! 1. Библиотека С№ Краткий обзор комекций Главное преимущество коллекций заключается в том, что они стандартизируют обработку групп объектов в программе.
Все коллекции разработаны на основе набора четко определенных интерфейсов. Некоторые встроенные реализации таких интерфейсов, в том числе Аггаут бяс, ВаяйсаЬ1е, Бсаск и Яцепе, могут применяться в исходном виде и без каких-либо изменений. Имеется также возможность реализовать собсгвеннукз коллекцию, хотя потребность в этом возникает крайне редко. В среде МЕТ Егашетчог1г поддерживаются пять типов коллекций: необобщенные, специальные, с поразрядной организацией, обобщенные и параллельные.
Необобщенные коллекции реализуют ряд основных структур данных, включая динамический массив, стек, очередь, а также словари, в которых можно хранить пары "ключ — значение". В отношении необобщенных коллекций важно иметь в виду следующее; они оперируют данными типа оЬ1 ес г. Таким образом, необобщенные коллекции могут служить для хранения данных любого типа, причем в одной коллекции допускается наличие разнотипных данных.
Очевидно, что такие коллекции не типизированы, поскольку в них хранятся ссылки на данные типа оЬб ее с. Классы и интерфейсы необобщенных коллекций находятся в пространстве имен Буясев. Со11есГ1опя. Специальные коллекции оперируют данными конкретного типа или же делают это каким-то особым образом. Например, имеются специальные коллекции для символьных строк, а также специальные коллекции, в которых используется однонаправленный список. Специальные коллекции объявляются в пространстве имен Буягев. Со11ессгопя.Брес1а11гесь В прикладном интерфейсе Со!1есбопя АР1 определена одна коллекция с поразрядной организацией — это В1гАггау. Коллекция типа В1гАггау поддерживает поразрядные операции, т.е. операции над отдельными двоичными разрядами, например И или исключактщее ИЛИ, а следовательно, она существенно отличается своими возможностями от остальных типов коллекций. Коллекция типа БгГАггау объявляется в пространстве имен Буясев.
Со11ессгопя. Обобщенные коллекции обеспечивают обобщенную реализацию нескольких стандартных структур данных, включая связные списки, стеки, очереди и словари. Такие коллекции являются типизированными в силу их обобщенного характера. Зто означает, что в обобщенной коллекции могут храниться только такие элементы данных, которые совместимы по типу с данной коллекцией. Благодаря этому исключается случайное несовпадение типов.
Обобщенные коллекции объявляются в пространстве имен Буягев.Со11есг1опя.цепег1с. Параллельные коллекции поддерживают многопоточный доступ к коллекции. Зто обобщенные коллекции, определенные в пространстве имен Буз сев. Со11есс топя . Сопспггепг. В пространстве имен Буягев. Со11есггопя. ОЬб есгмобе1 находится также ряд классов, поддерживающих создание пользователями собственных обобщенных коллекций.
Основополагающим для всех коллекций является понятие перечислителя, который поддерживается в необобщенных интерфейсах 1Еп овеха сог и 1ЕопвегаЬ1е, а также в обобщенных интерфейсах 1Епавегасог<т> и 1ЕппвегаЬ1е<т>. Перечислитель обеспечивает стандартный способ поочередного доступа к элементам коллекции. Следовательно, он яеречисляегв содержимое коллекции. В каждой коллекции должна быть Глава 25.
Комекции, перечисаители и итераторы 925 реализована обобщенная или необобщенная форма интерфейса 1ЕпшаегаЬ1е, поэтому элементы любого класса коллекции должны быть доступны посредством методов, определенных в интерфейсе 1Епоыегасог или 1Епшаегасог<Т>. Это означает, что, внеся минимальные изменения в код циклического обращения к коллекции одного типа, его можно использовать для аналогичного обращения к коллекции другого типа. Любопытно, что для поочередного обращения к содержимому коллекции в цикле Тогеасп используется перечислитель.
Основополагающим для всех коллекций является понятие яеречислителя, который поддерживается в необобщенных интерфейсах 1Епптегасог и 1ЕпшаегаЬ1е, а также в обобщенных интерфейсах 1епцтегагог<т> и 1епцыегаЬ1е<т>. Перечислитель обеспечивает стандартный способ поочередного досгупа к элементам коллекции. Следовательно, он пергчисляеяг содержимое коллекции.
В каждой коллекции должна быть реализована обобщенная или необобщенная форма интерфейса 1ЕпиыегаЬ1е, поэтому элементы любого класса коллекции должны быть доступны посредством методов, определенных в интерфейсе 1епиыегагог или 1епшаегагог<т>. Это означает, что, внеся минимальные изменения в код циклического обращения к коллекции одного типа, его можно использовать для аналогичного обращения к коллекции другого типа. Любопытно, что для поочередного обращения к содержимому коллекции в цикле ТогеасЬ используется перечислитель. С перечислителем непосредственно связано другое средство, называемое игяераягором.
Это средство упрощает процесс создания классов коллекций, например специальных, поочередное обращение к которым организуется в цикле Тогеасп. Итераторы также рассматриваются в этой главе. И последнее замечание: если у вас имеется некоторый опыт программирования на С++, то вам, вероятно, будет полезно знать, что классы коллекций по своей сути подобны классам стандартной библиотеки шаблонов (ВГапг(агг) Тегпр!аГе ЫЬгагу — БТЬ), определенной в С++. То, что в программировании на С++ называется конеейнером, в программировании на С4 называется коллекцией.
Это же относится и к )ауа. Если вы знакомы с библиотекой Со11есбопз Ргатетуог)г для )ага, то научиться пользоваться коллекциями в СФ не составит для вас большого труда. В силу характерных отличий каждый из пяти типов коллекций (необобщенных, обобщенных, специальных, с поразрядной организацией и параллельных) будет рассмотрен далее в этой главе отдельно. Необобщенные комекции Необобщенные коллекции вошли в октав среды .)ч'ЕТ Ргашеи ог)г еще в версии 1.0.
Они определяются в пространстве имен я уз геы. Со11есг г опз. Необобщенные коллекции представляют собой структуры данных общего назначения, оперирующие ссылками на объекты. Таким образом, они позволяют манипулировать объектом любого типа, хотя и не типизированным способом.
В этом состоит их преимущество и в то же время недостаток. благодаря тому что необобщенные коллекции опериругот ссылками на объекты, в них можно хранить разнотипные данные. Это удобно в тех случаях, когда требуется манипулировать совокупностью разнотипных объектов или же когда типы хранящихся в коллекции объектов заранее неизвестны. Но если коллекция предназначается для хранения объекта конкретного типа, то необобщенные коллекции не обеспечивают типовую безопасность, которую можно обнаружить в обобщенных коллекциях. 926 Часть й. Библиотека Св' Необобщенные коллекции определены в ряде интерфейсов и классов, реализующих эти интерфейсы. Все они рассматриваются далее по порядку.
Интерфейсы необобщенных коддекций В пространстве имен Еуасев. Со11есвтопз определен целый ряд интерфейсов необобщенных коллекций. Начина~ь рассмотрение необобщенных коллекций следует именно с интерфейсов, поскольку они определяют функциональные возможности, которые являются общими для всех классов необобщенных коллекций. Интерфейсы, служащие опорой для необобщенных коллекций, сведены в табл.
25.1. Каждый из этих интерфейсов подробно описывается далее. Таблица 25.1. Интерфейсы необобщенных комекций Интерфейс 1со11есс1оп Описание Определяет элементы, которые должны иметь асе необоб- щенные комекции Определяет метод Совраге () для сравнения объектов, хра- нящихся а комекции Определяет коллекцию, состоящую из пар "ключ-значение" Определяет перечислитель для коллекции, реализующей ин- терфейс 1Р1сс1опагу Определяет метод ОеГЕппвегасог (), предоставляющий перечислитель для любого класса комекции Предоставляет методы, позволяющие получать содержимое комекции по очереди Сравнивает два обьекга на предмет равенства Считается устаревшим.
Вместо него следует использовать ин- терфейс 1ес(ца11гусоврагег Определяет комекцию, доступ к которой можно получить с по- мощью индексатора Определяет метод соврагето (), применяемый для струк- турного сравнения Определяет метод Ег(ца1а (), применяемый для выяснения структурного, а не ссьвочного равенства. Кроме того, опреде- ляет метод Оевназпсос(е () 1Соврагег 1Р1ссуопагу 1РЕссйопагуЕпшпегасог 1ЕппвегаЬ1е 1ЕппвегаГог 1Ес(ца11сусоврагег 1Наапсос(ергоч1с(ег 1Ь1вг 1НГгпсгога1СоврагаЬ1е 1ЯГгпсгога1Ес(паваЬ1е Интерфейс 1Со11еоЬйоп аогг) Соруто Сяггау Гагдас, ьпс асагГТг)х) Интерфейс 1со11есг1оп служит основанием, на котором построены все необобщенные коллекции.
В нем объявляются основные методы и свойства для всех необобщенных коллекций. Он также наследует от интерфейса 1ЕппвегаЬ1е. В интерфейсе 1со11есгвоп определяются перечисленные ниже свойства. Свойство Соцп Г используется чаще всего, поскольку оно содержит количество элементов, хранящихся в коллекции на данный момент. Если значение свойства Сопев равно нулкъ то коллекция считается пустой. В интерфейсе 1Со11есслоп определяется следующий метод. Глава 25.
)(оллекции, перечислители и итераторы 927 Назначение Свойство Рпс Соопс ( деТт ) Содержит количество элементов в коллекции на данный момент Ьоо1 1эБупсигоппхео ( дест ) Принимаетлогическое значение тгпе, если коллекция синхронизирована, а иначе — логическое значение Га1эе. По умолчанию коллекции не синхронизированы. Но для большинства коллекций можно получить синхронизированный вариант оЬ1ест Бупсноот ( дет; ) Содержит объект, для которого коллекция может быть синхронизирована Метод Соруто () копирует содержимое коллекции в массив Татдес, начиная с элемента, указываемого по индексу этагттг(х Следовательно, метод соруто () обеспечивает в СФ переход от коллекции к стандартному массиву. Благодаря тому что интерфейс 1Со11есТ1оп наследует от интерфейса 1ЕпшвегаЬ1е, в его состав входит также единственныи метод, определенный в интерфеисе 1ЕпилтегаЬ1е.