Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 183
Текст из файла (страница 183)
Таким образом, на каждом шаге цикла гогеасп в методе Мака () возвращается только один символ. Создание именованного итератора В приведенных выше примерах был продемонстрирован простейший способ реализации итератора Но ему имеется альтернатива в виде именованного итератора В данном случае создается метод, оператор или аксессор, возвращающий ссылку на объект типа 1еппве гаь1е. Именно этот объект используется в коде для предоставления итератора. Именованный итератор представляет собой метод, общая форма которого приведена ниже. рпвгхс 1ЕппвегаЬ1е имв итератора(список параметров) ( // ...
ухе1С гекогп оЬУ) ) где имя итератора обозначает конкретное имя метода; список параметров— нуль или более параметров, передаваемых методу итератора; о)оу — следующий объект, возвращаемый итератором. Как только именованный итератор будет создан, его можно использовать везде, где ои требуется, например для управления циклом гогеасп.
Именованные итераторы оказываются весьма полезными в некоторых ситуациях, поскольку они позволяют передавать аргументы итератору, управляющему процессом получения конкретных элементов из коллекции. Например, итератору можно передать начальный и конечный пределы совокупности элементов, возвращаемых из коллекции итератором. Эту форму итератора можно перегрузить, расширив ее функциональные возможности. В приведенном ниже примере программы демонстрируются два способа применения именованного итератора для получения элементов коллекции. В одном случае элементы перечисляются в заданных начальном и конечном пределах, а в другом — элементы перечисляются с начала последовательности и до указанного конечного предела. // Использовать именованные нтераторы.
пвгпп Яувсевк пвгпп Яуявев.Со11есс1опяк с1авв МуС1аяв ( айаг сь = 'А'; Глава 24, коллекции, перечислители и итераторы 911 // Этот итератор возвращает буквы английского // алфавита, начиная с буквы А и кончая указанньвя // конечным пределом. рпЫас ХБппщегаЫе Му1сг(апс епб) ( Гог(апс 1=от 1 < епбт 1ь+) уае16 гесогп (сйаг) (сй ь 1)т ) // Этот итератор возвращает буквы в заданных пределах. рнЫ1с 1ЕпниегаЫе Му1сг(апс Ьеоап, апс епт() ( ток(1пг а=йеоап; 1 < епбт 1++) уае1б гегнгп (сйаг) (сй + 1) т ) ) с1аяя 1сгоещо4 ( ятавьс чо(А Ма1п О ( МуС1аяя щс = пен МуС1аяя()т Сопяо1е.ИгасеЬ1пе("Возвратить по очереди первые 7 букв:"); гогеасЫсЬаг сй ап щс.Му1кг(7) ) Сопяо1е.Иг1се(сЬ + " ") т Сопяо1е.
Иг1сещпе ("1п" ) т Сопяо1е.иг1сеъьпе("Возвратить по очереди буквы от Г до Ьт")т тогеасй(сйаг сй 1п ис.Му1сг(5, 12)) Сопяо1е.игасе(сЬ е " ")т Сопяо1е .Игагеьапе () т ) ) Эта программа данг следующий результат: Возвратить по очереди первые 7 букв: А В С Р Е Г Я Возвратить по очереди буквы от Г до Ш Г 6 Н 1 Ю К Ь Создание обобщенного итератора В приведенных выше примерах применялись необобщенные итераторы, но, конечно, ничто не мешает создать обобщенные итераторы. Для этого достаточно возвратить объект обобщенного типа 1Епнщегагог<т> или 1Епощегай1е<т>.
Ниже приведен пример создания обобщенного итератора. // Простой пример обобщенного итератора. ияапп Эувсели ияапч Эуягещ.со11есгтопя.пепегтст 912 Часть!1. Библиотеиа С() с1азз МуС1авв<Т> ( Т[) аггау; риЬ11с МуС1авв(Т(] а) ( аггау = аи // Этот итератор возвращает символы из массива спгз. риЬ11с 1Еппщегагог<Т> ОеГБппщегасог() ( тогеасп(Т оЬ3 1п аггау) уте1О гегигп оЬ37 ) с1азз Яепегтс1тгоещо ( всатгс го1о Ма1п() ( 1пг[) поев = ( 4, 3, 6, 4, 7, 9 )7 МуС1азз<апт> щс = пеи МуС1азз<1пс>(пища) Гогеасп(тпт х Тп щс) Сопво1е.Иг1се(х + " ") 7 Сопво1е.Игтсеьтпе() 7 Ьоо1[] Ьча1в = ( стае, стае, Га1ве, стае )7 МуС1авв<Ьоо1> щс2 = пеи Мус1азз<Ьоо1>(Ьуа1в) Гогеасп(Ьоо1 Ь Тп щс2) Сопво1е.нт).се(Ь ь " ") 7 Сопзо1е.нгттеь[пе(); ) ) Вот к какому результату приводит выполнение этой программы: 436479 Тгие Ттое Га1ве Ттие В данном примере массив, состоящий из возвращаемых по очереди объектов, передается конструктору класса МуС1азя.
Тип этого массива указывает в качестве аргумента типа в конструкторе класса МуС1авз. Метод сескппщетатог () оперирует данными типа т и возвращает перечислитель типа 1еппщетасог<т>. Таким образом, итератор, определяемый в классе муС1аяз, может перечислять данные любого типа. Инициализаторы коллекций В версии С() 3.0 было внедрено новое средство — ииициализав)ор коллею(ии, которое упрощает инициализацию некоторых коллекций.
Вместо того чтобы явно вызывать метод )(<(о (), при создании коллекции можно указать список инициализаторов. После этого компилятор организует автоматические вызовы метода )(с(<( (), используя значения из этого списка, Синтаксис в данном случае ничем не отличается от инициализации масси- Глава 24.
Коллекции, перечислители и итераторы 913 ва. Обратимся к следующему примеру, в котором создается коллекция типа Оввс<с)тат>, инициализируемая символами С, А, Е, В, Р и Е: 11вг<сьаг> 1вг пен 11вт<сьаг>() ( 'С', 'А', 'Е', 'В', 'О', 'Г' )т После выполнения этого оператора значение свойства 1вс.соппс будет равно 6, поскольку именно таково число инициализаторов. А после выполнения следующего цикла гогеас)т: Гогеасп(сп гп 1вг) Сопво1е.ыг1ке(сь ь " "); получится такой результат: САЕВОГ Для инициализации коллекции типа О1пхебывс<тк, тч>, в которой хранятся пары "юпоч — значение", инициализаторы приходится предоставлять парами, как показано ниже. Яоггесвьвг<1пг, вкк1пс> 1вг = пен яогсесььвс<1пс, всг1пч>() ( (1, "один"), (2, "два" ), (3, "три") )т Компилятор передаст каждую группу значений в качестве аргументов методу Ас)с( () .
Следовательно, первая пара инициализаторов преобразуется компилятором в вызов АсЫ(1, "один"). Компилятор вызывает метод Ас)п () автоматически для ввода инициализаторов в коллекцию, и поэтому инициализаторы коллекции можно использовать только в коллекциях, поддерживающих открытую реализацию метода АсЫ () . Это означает, что инициализаторы коллекции нельзя использовать в коллекциях типа ясасх, ясаск<т>, ()пене или Япепе<Т>, поскольку в них метод А<И () не поддерживается.
Их нельзя применять также в тех коллекциях типа ып)сеж1вс<т>, где метод Ас(п () предоставляется как результат явной реализации соответствующего интерфейса. ГЛАВА Сетевые средства подключения к Интернету я зык С№ предназначен для программирования в современной вычислительной среде, где Интернету, естественно, принадлежит весьма важная роль. Одной из главных целей разработки С№ было внедрение в этот язык программирования средств, необходимых для доступа к Интернету. Такой доступ можно было осуществить и в предыдущих поколениях языков программирования, включая С и С++, но поддержка операций на стороне сервера, загрузка файлов и получение сетевых ресурсов в этих языках не вполне отвечали потребностям большинства программистов.
Эта ситуация коренным образом изменилась в С№. Используя стандартные средства С№ и среды .НЕТ Егатеъогк, можно довольно легко сделать приложения совместимыми с Интернетом и написать другие виды программ, ориентированных на подключение к Интернету. Поддержка сетевого подключения осуществляется через несколько пространств имен, определенных в среде .НЕТ Егашеч огк, и главным среди них является пространство имен зуэсеж. нес. В нем определяется целый ряд высокоуровневых, но простых в использовании классов, поддерживающих различные виды операций, характерных для работы с Интернетом.
Для этих целей доступен также ряд пространств, вложенных в пространство имен яузсев. Нее. Например, средства низкоуровневого сетевого управления через сокеты находятся в пространстве имен яуэеев. Нее. яосхееэ, поддержка электронной почты — в пространстве имен Буэсев. Нее. Ма11, а поддержка защищенных сетевых потоков — в пространстве имен З уз сев. Нес.
Зесигьг у. Дополнительные функциональные возможности предоставляются в ряде других вложенных пространств имен. К числу других не менее важных пространств имен, связанных с сетевым подключением к Интернету, относится пространство зуэееп. иеЬ. Это и вложенные в него пространства имен поддерживают сетевые приложения на основе технологии АЯРХЕТ. В среде .НЕТ Ргаше~чогк имеется достаточно гибких средств и возможностей для сетевого подключ4~ия к Интернету. Тем не менее для разработки многих приложений более предпочтительными оказываются функциональные возможности, доступные в пространстве имен зуэсет. нег.