Главная » Просмотр файлов » Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010)

Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 74

Файл №1160865 Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010)) 74 страницаНэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865) страница 742019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 74)

Это можно сделать следующим образом: пя1по Зуягевк пя1пп Яуягев.со11есгсопя.сепег)сп рпЬ1>с с1аяя ЕпггуРсгпС ( ягаггс рпЫгс 1ЕппвегаЫе<гпС> Раиегя( гпС Гсов, Тпг Со ) Гог( гпг г = утопи г <= Со; ++1 ) ( у1е1п( гегпгп (1пг) МяСЬ.Рон( 2, ) ) ягнггс чогд Мя1п() ( 1ЕппвегяЬ1е<зпС> роиегя = Ронегя( С, 16 ) Гсгеясп( гпг геяп1С гп рочегя ) ( Сопяо1е.нг1геьапе( геяп1С ); Массивы, типы коллекций и итераторы 277 В данном примере компилятор генерирует единственный тип, реализующий четыре интерфейса: 1ЕпивягаЬ1я<1пс>, 1ЕпивегаЬ1е, 1Епивягясог<1пс> и 1Епивегасог. Поэтому этот тип выступает и как перечислимый, и как перечислитель.

В итоге любой метод, содержащий блок уье1б, должен возвращать тип 1ЕпивегаЬ1е<1пс>, 1ЕпивегаЬ1е, 1епивегягог<1пг> или 1епивягагог,где т — уье1б-тип метода. Компилятор сделаетостальное. Рекомендуется придерживаться обобщенных версий. поскольку они позволяют избежать необходимости в упаковке типов значений и обеспечивают большие возможности для механизма контроля типов. В предыдущем примере значения г гав и го сохраняются в общедоступных полях перечислимого типа, как было показано ранее в атом разделе. Поэтому если нужно предотвратить возможность изменения их пользователями во время перечисления, они могут быть помещены в оболочку неизменяемого типа.

Совет. В книге Кжиштова Цвалина (Кггузг!о( Сшайпа) и Брэда Абрамса (Втаб АЬшгля) Егяглеиогз Вяз(дп Вшбе))пеж Сопчепбопз, !бгбглз, апб Ряпегля Гог ЯеояаЫя . ИЕТ Жгапез (Абб(яоп-УУез(еу Рго(еяяюпа1, 2005 г.) Я предполагается, что тип никогда не должен реализовывать одновременно 1ЕпивегаЬ1е<т> и 1Епивегасог<т>, поскольку отдЕльный тип должен быть семантически либо коллекцией, либо перечислителем, но не тем и другим сразу. Однако объекты, сгенерированные блоками уье1б, нарушают это правило. Для закодированных вручную коллекций необходимо попытаться следовать данному правилу, даже несмотря на то, что Св его нарушает, чтобы сделать блоки уье1б более полезными.

Прямые, обратные и двунаправленные итераторы Многие библиотеки в своих контейнерных типах поддерживают три основных разновидности итераторов — прямые, обратные и двунаправленные. Прямые итераторы— это аналог обычных перечислителей, реализующих 1Епивегагог<Т>, которые можно получить из методов СеГЕпивегагог контейнерных типов библиотеки .]()ЕТ. Однако что, если понадобится обратный или двунаправленный итератор? СВ позволяет создавать их легко и просто. Чтобы получить обратный итератор для контейнера, понадобится лишь создать блок уье1б, проходящий циклом по элементам коллекции в обратном порядке. Что еще удобнее — блок у].е1с1 обычно можно объявлять внешним по отношению к коллекции, как показано в следующем примере: ияьпй Зуягеги изьпд Яуясев.Со11ясгьопя.ояпегьс( риЬ11с с1азз Епсгувоьпс ( зсасьс чоьб Ияьп() ( Ььяг<ьпс> ьпгвьзг пен Ььяс<ьпс>(); ьпсдьзс.лбб( 1 ): 1ПГЬ1зс.йбб( 2 ) г 1пГЬ1яс.лбб( 3 )' 1ПГЬ1яг.лбб( 4 )г Гогяясп( ьпс и тп Сгяясяаячегяе1кегясог(1пГЬ1яс) ) ( Сопяо1я.нг1сявьпя и ( ) ) ясягьс 1епивегаьье<т> сгяягяеячегзя1гягягог<т>( 1ььяс<т> 11яг ) ( ьпс соипс = 11яГ.Соипс; Гог( 1ПГ 1 = Сисис 1; 1 > О; 1 ) ( у1е1б гясигп 11яс[1]; Планируется к вылову.

Разрабоптка инфрагтпрухгпуры прояюпирояаншс соглашения, идио- мы и шаблоны (ИД "Вильямс", 2010 г). 278 Глава 9 Основная функциональность сосредоточена в методе Стеатенеуегзе1Сетатог<Т>. Этот метод работает только с коллекциями типа 1ьтзс<т>, но несложно написать другую форму Стеагенеуетзе1Сетатот<Т>, принимающую какой-нибудь другой тип коллекции. Служебные методы такого рода всегда лучше делать насколько возможно обобщенными в отношении принимаемых типов.

Например, можно было ли сделать сгеасеееуегзе1сегасот<т> методом еще более общего назначения, чтобы он принимал тип Ьсо11ессаоп<т>7 Нет, потому что 1со11ессгоп<т> не объявляет операцию индекса. 11,1зс<т>, однако, делает зто. Теперь обратите внимание на двунаправленный итератор. Чтобы сделать из пере- числителя двунаправленный итератор, нужно иметь возможность переключать его направление. Как указывалось ранее, перечислители, создаваемые из методов, которые принимают параметры и содержат блок усе1с(, обладают общедоступными полями, доступными для модификации.

Хотя для доступа к ним приходится использовать рефлексию, все же зто возможно. Для начала взглянем на возможный сценарий использования для двунаправленного итератора: зтаттс лото Ма1п () ( Ььп<ес(ьгвт<спс> ЬпСЬЬзс = пек Ьап<есььзг<сис> (); тот( Ьпс 1 = 1л 1 < 6) вы ) ( ЬиСЫзг.лоОЬазт( 1 )л В1<(1тесссоиа11сетасог<1пс> Ьсег = иек В1бтгесгтопа11Сегатот<апг>(1игьазт, ЬпСЬЬзС.ГЬтзг, Т1гегаготпттесггои.уотзагс) Готеась( 1пт п Ьп Ьтег ) ( Сопзо1е.кттгеЬ1ие( и ); 11(и==5 ) тгег.оагесстоп = Т1СегагогпттесСЬоп.Васлзагпп ) Вам нужен способ создания объекта итератора, поддерживающего 1ЕпииетаЫе<Т>, чтобы затем применять его внутри оператора Тотеасп для запуска перечисления. В лю- бой момент внутри блока Гогеасп необходима возможность переключать направление итерации.

В следующем примере показан класс ВсбсгесСЬопа11Сегагог, который со- вершенствует предыдущую модель использования. рпЫтс епив Т1СетаеогОЬгестаоп ( Готкато, Васккаго )' рпыас с1азз ВЬосгесс1опа11сетасот<т>: 1еппкегаЫе<т> ( риыас Вго1гессаопа11сегасог( ьапхеоьсзс<т> 11вс, ЬЬпхес)Ь1згкобе<Т> згагт, т1сетасотоьтесстоп ест ) ( еппиегагог СтеагеЕиииетаСог( 11зг, зсагс, бтт ) .ОеСЕпииегагот() л епиитуре епитегагот.оеСТуре()) ) Массивы, типы коллекций и итераторы 279 рпо11с Т1тегатогрвгестгоп Ругестгоп ( дег ( тетптп (Т1тегатогртгесттоп) еппвтуре.яету1е1б("б1г") .Яетуа1пе( еппвегатог )т ) зег ( еппвтуре. Сету1е1б ( "бгт" ) .

яетуа1пе ( еппветатог, та1пе )т ) ) ргттате 1еппветагог<т> еппвегатогт рттгате Туре еппвТурет рт1уате 1еппвета)тте<т> стеагееппветагог( 11пкеб11зт<т> 11зт, 11п)теб11зткобе<Т> зтатт, Тттетатотргтестгоп бгг ) ( 11п)тебьгзгыобе<Т> сптгепт = пп11; бо ( 1г( сптгепт == пп11 ) ( сптгепт = згаттт ) е1зе ( 1т( бьг == Т1тетатоготгестгоп.уотиатб ) ( спггепг = спггепт.иехт/ ) е1яе ( сптгепт = спттепг.ргеегоизч 11( спгтепг != пп11 ) ( уге1б тетпгп спггепт.уа1пе; ) ) ип11е( спггепт (= пп11 )т ) рп)т11с 1Еппвегатот<Т> Сеткппветатог() ( гетттп еппвегатотт ) 1Еппвегатог 1ЕппветаЬ1е.оеткппвегатот О ( гетптп оетЕпгветатот()т ) ) Формально помещать перечислитель в оболочку класса Вт.б).гест1опа11тетатог не обязательно. Можно было бы обращаться к переменной направления напрямую.

через рефлексию, внутри блока Тотеас)т. Однако для того, чтобы сделать это, коду внутри блока Тотеас)т понадобилось бы имя параметра, переданного в методе В1б1тест1опа11тегатот.сгеагееппветагот с блоком уге1б. Чтобы избежать такого противоестественного связывания, он был размещен внутри класса-оболочки В1б1гест1опа11гетатот с предоставлением свойства ейгест1оп для обращения к общедоступному полю перечислителя. И, наконец, в приведенном ниже примере демонстрируется применение той же техники для реализации циклического перечислителя.

Его можно использовать для таких вещей, как игровые циклы, где нужно независимо выполнять итерацию по коллекциям сущностей, обновляя их состояние при каждом проходе — до тех пор, пока не поступит запрос на выход. пз1пч Яузгето пзтпо Яузтев.Со11ест1опя; пзтпд Яузтев.со11ест1опз.оепет1с; 280 Глава 9 риЬ11с с1азв ЕпггурозпС ( згагзс чо1с( Меси() ( 11пяеойсвг<1пг> гпгвуяг = пею 11пгесйсяг<1иг>(); Рог( Тпг 1 = 1; 1 < 6; ++1 ) ( 1пгйсяС.Ас)с(йаяг( 1 ); ) Сугси1аг1Сегагог<зпг> 1Сег = пев Сугси1аг1Сегагог<зпг>(1пСЬТяг, 1пС11вС.Р1гяг)1 1иг соипгег = 0; Тогеасп( гпс и Тп 1сег ) ( Сопзо1е.ХгсгеЬ1пе( п ); 11( сонпгег++ = 100 ) ( ТСег Есор () . ) ) риь11с с1азв сагси1аг1сегасог<т>: 1епивегаь1е<т> ( риЬ11с С1гси1аг1Сегагог( 11пвеой1вг<Т> 11зг, ангес(11вгрос(е<Т> вгагС ) ( епивегагог СгеагеЕпивегагог( 11вг, всагс, йа1яе ).беСЕпивегагог(); епиаТуре епиеегагог.беСТуре()) ) риЬ11с чо1о Ягор() ( епивТуре.беСРТе16("асор").Яегча1ие( епиаегагог, Сгие )) ргзчасе 1епиаегасог<т> епипегасог) ргачасе Туре епивТуре) ргачасе 1епивегаьае<т> сгеасеепивегасог( ьупкеньавс<т> 11вс, 11пгеб11вСМоое<Т> вгагг, Ьоо1 есор ] ( 11игебь1всмоое<т> сиггепс пи11) ио ( 11( сиггепг пи11 ) ( сиггепС = зсагс) ) е1ве ( сиггепг = сиггепС.Мехг) 11( сиггепС == пи11 ) ( сиггепс всагс; ) ууе1и гесигп сиггепс.ча1ие) ) вЬ11е( (ягор )) ) рисувс 1Епипегагог<Т> беСЕпиаегагог() ( гесиги еиитегагог) ) 1ЕпивегаСог 1ЕпитегвЬ1е.беСЕпиаегагог() ( гесигп бесепивегасог(); ) ) Массивы, типы коллекций и итерзторы 2В1 Метод Бсср был включен в Стгсп1аг1аегакаг<Т>, чтобы можно было легко остановить итерацию.

Конечно, нак и в примере с двунаправленным итератором, метод Бкор использует рефлексию для установки общедоступного поля ясар сгенерированного компилятором перечислителя. Для создания сложных путей итерации можно найти и намного более интересные способы применения блоков у1е1с(. Инициализаторы коллекций В версии С№ 3.0 введен новый сокращенный синтаксис инициализации коллекций, подобный синтаксису инициализаторов объектов. Если экземпляр типа коллекции, которую вы пытаетесь инициализировать, реализует интерфейс 1ЕпатегаЬ1е или 1ЕпавегаЬ1е<Т> и имеет общедоступный метод Ас(с(, который принимает один параметр содержащегося типа, то можно использовать новый синтаксис.

Характеристики

Тип файла
DJVU-файл
Размер
8,22 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Нэш Трей - C# 2010
Accelerated_C_2010-4565
3_syntax_overview
3_generics_1.cs
as_1.cs
boxing.cs
conversions_1.cs
implicit_type_1.cs
is_1.cs
references_1.cs
references_2.cs
references_3.cs
values_1.cs
4_classes_structs
4_abstract_classes_1.cs
4_beforefieldinit_1.cs
4_box_1.cs
4_box_2.cs
4_box_3.cs
4_box_4.cs
4_box_5.cs
4_class_definition_1.cs
4_compareto_1.cs
4_containment_example_1.cs
4_containment_example_2.cs
4_containment_example_3.cs
4_ctor_struct_1.cs
4_ctor_struct_2.cs
4_ctor_struct_3.cs
4_destructor_1.cs
4_destructor_2.cs
Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7054
Авторов
на СтудИзбе
259
Средний доход
с одного платного файла
Обучение Подробнее