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

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

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

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

Поэтому. если обобщение содержит поле вроде такого: риЬ11с с1аээ Мупепег1с<Т> ) риьагс эгагас Тпс эгаг1сгге16) ) то Мубепегас<1пс>.згагасу1е16 и Мубепег1с<1опд>.зсас1с?1е1с) будут ссылаться на разные места в памяти. Мораль атой истории в том, что необходимо учитывать инженерные компромиссы. Хотя обобщения помогают избежать упаковки/распаковки и обычно порождают более эффективный код, они также увеличивают размер рабочего набора приложения. При наличии сомнений, можно воспользоваться инструментами анализа производительности, которые помогут принять правильное решение. ХЕпцшехаЬ1е<Т>, ХЕпятеха1ох<Т>, ХЕгинпехаЬ1е и ХЕтинвеха1ох Ранее уже было показано, как использовать оператор Тогеасп для удобного выполнения итерации по коллекции объектов, включая Бузгегл.

Актау, Аггауьазс. 11эг<т> и т п. Как это функционирует? Каждая коллекция, которая должна работать с То ге а оп, должна реализовать интерфейс 1ЕпипегаЬ1е<т> или 1епотегаЬ1е. Этот интерфейс используется гогеасЬ для получения объекта, знающего, как перечислить, или выполнить итерацию, по элементам коллекции. Объект итератора, полученный от 1еповегаь1е<т>, должен реализовать интерфейс 1епптегасог<т> нли 1епитегзгог. Обобщенные типы коллекций обычно реализуют 1епспегагог<т>. а объект перечислителя — 1Епптегзсог<Т>. Интерфейс 1ЕппмегаЬ1е<Т> наследуется от 1ЕпптегаЬ1е, Массивы, типы коллекций и итераторы 269 а 1Епивегатот<Т> — от 1Епивегатот. Это позволяет применять обобщенные коллекции там же, где используются необобщенные.

Строго говоря, типы коллекций не обязаны реализовывать перечислители, и пользователь может выполнять итерации в цикле Тот, если предусмотрена операция индекса, например, путем реализации интерфейса 1Ььзт<Т>. Однако зто не самый изящный подход. После того, как будет продемонстрировано, насколько легко создавать перечислители с помощью блоков итераторов, вы иоймете,что реализовать |ЕпиветаЬ1е<Т> и 1Епиветатог<Т> — пара пустяков. Многие читатели уже знакомы с необобщенными интерфейсами перечислителей и с тем, как реализовать перечислители на типах коллекций.

Далее в разделе внимание уделяется обычно умалчиваемым моментам создания перечислителей "с нуля" и кратко рассматривается новый усовершенствованный способ создания перечислителей с использованием блоков итераторов. Коли хотите, можете пропустить эту часть и перейти к следующему разделу, посвященному итераторам. При желании освежить в памяти тему реализации перечислителей читайте все.

Интерфейс 1ЕпиветаЬ1е<Т> предусмотрен для того, чтобы клиенты имели четко определенный способ получения перечислителя для коллекции. Ниже показано определениеинтерфейсов 1ЕпиветаЫе<Т> и 1ЕпивегаЬ1е: риь11с тптеттасе 1епивегаь1е<т>: 1епиветаь1е ( 1Епиветатот<Т> йетхпиветатот О к ) риЬ1>с 1птегтасе 1ЕпивегаЬ1е ( 1епивегатот бетепиветатог О ! Поскольку оба интерфейса реализуют метод ЕетЕпивегатог с одной и той же сигнатурой перегрузки (вспомните, что тип возвращаемого значения при разрешении перегрузки не учитывается), любая коллекция, реализующая 1ЕпиветаЫе<Т>, должна явно реализовать метод Еетепивегатог. Больше всего имеет смысл явно реализовать иеобобщенный метод 1епиветаые.бетепиветатог.

Интерфейсы 1Епиветатот<Т> и 1Епивегатот выглядят следующим образом; риы1с 1птетгасе 1епиветатог<т>; 1епиветатот, 101зрозаь1е ( т ситтепт ( песк ) ) риЬ1>с тптетгасе 1Епивегатот ( оЬ1ест ситтепт ( иет; Ьоо1 Моиекехт О к иотк) Кезет О ) ) Эти два интерфейса реализуют член с одинаковой сигнатурой — в данном случае свойство еиггепт. В случае реализации 1епивегагот<т> должен быть явно реализовано свойство 1Епиве гасит.

Еиггепт. К тому же обратите внимание, что 1Епиветатог<Т> реализует интерфейс 1()ьзрозаЬ1е. Позже будет объясняться, чем это хорошо. Атеперь рассмотрим, как реализовать Тепиветаь1е<т>и 1епивегасот<т> длядоморощенного типа коллекции. Хороший учитель всегда сначала показывает, как сделать что-то "трудным способом", а только потом переходит к "легкому способу".

Такой прием очень полезен, поскольку позволяет понять, что происходит "за кулисами". Когда вы понимаете, как работает внутренний механизм. то лучше подготовлены к тому, чтобы иметь дело с техническими нюансами легкого способа". Рассмотрим пример реализа- 270 Глава 9 цви 1ЕпиветаЬ1е<Т> и 1Епивегатог<Т> "трудным способом" для доморощенной коллекции целых чисел.

В примере будет показано, как реализовать обобщенные версии, поскольку это предполагает также реализацию необобщенных версий. Чтобы не загромождать пример, 1Со11есг].оп<Т> не реализуется. а все внимание сосредоточивается только на интерфейсах перечисления. изапд Яузгев; изспд Яузгев.ТЬгеабапяч изапд Бузгев.Со11естаопз; изапд Яузтев.Со11естгопз.оепегас; риЫЬс с1азз МуСо11<Т>: 1ЕпивегаЫе<Т> риЪ1>с МуСо11( Т(] 1гевз ) ( СЫз.агевз = >Сева; ) риь11с 1епивегасог<т> Бесепивегасог() ( гетитп пен МезтеоЕпивегагог( СЫз )л 1епивегасог 1епивегаь1е.яесепиветасот() ( тегигп СеСЕпиветатот(); // Определение перечиспителя. с1азз мезсеоепивегасог: 1епивегасот<т> ( риЬ1гс МезгеоЕпивегатог( МуСо11<Т> со11 ) ( Мол>Сот.ЕпСег( со11.1Севз.зупсаооС )) СЫз.споех = -1; спаз.со11 = со11~ ) риЫгс Т Сиггепс ( Бег ( тегигп сиггепС) ] ) оЬ1ест 1Епивегатог.СиггепС ( Бег ( тегигп Сиггепе; ) ) риЫЬс Ьоо1 Моиеиехт() ( 11( ++спс(ех >= со11.1Севз.Ьепдсп ) гетигп Та1зе) е1зе сиггепт = со11.>Сева(гпоех]) гетигп Сгие) ) риЫгс иотб везет() ( сиггепг оегаи1С(Т) 1пеех = 0) ! риЫгс иотб Разрозе () ( сгу ( сиггепг = Оегаи1с(Т)) 1пс(ех со11.1Севз.ЬепдСЬ| ) 11па11у ( Моп1Сог.Ехгг( со11.1Севз.зупсвоог )) ) Массивы, типы коллекций и итервторы 271 рггчзСе Мусо11<т> са11; Рг1оаге Т сиггепСт ргсчаге гпС 1паех! ( РггчаСе Т(( ТСевз; РоЬ11с с1азз Епггуеагпг ( эгаСТс чоха Мэгп() МуСо11<гпс> гпгечегз = пен муса11<1пс>( пен спс(1 (1, 2, 3, 4( гагеасп( Тпг и 1п 1пгеаесз Сапзо1е.ыгггеьгпе( и ); ( На заметку! 8 более реальных случаях пользовательский класс коллекции наследуется от са11есссап<т> и реализация 1еппмегаь1е<т> получается бесплатно.

В этом примере внутренний массив муса 11 < т> инициализируется случайным набором целых чисел, так что перечислитель получает некоторые тестовые данные. Разумеется, в реальном контейнере должен быть реализован интерфейс 1со11есс1ап<т>, что позволит динамически наполнять коллекцию элементами. Оператор Тогеасп разворачивается в код, получающий перечислитель вызовом метода сесеполтегзсог на интерфейсе 1ЕпцмегзЬ1е<Т>. Компилятор достаточна интеллектуален, чтобы использовать в данном случае 1Епцкегагаг<Т>. СеСЕпамегзгог вместо 1Еппмегагог.

СеСЕпалтегагаг. После получения перечислителя запускается цикл, в котором сначала вызывается метод Моттемехг, а затем переменная и инициализируется значением, возвращенным из свойства сцггепс. Если цикл не содержит других путей выхода, он продолжается до тех пор, пока мочемехс не вернет Тз1эе. В этот момент перечислитель завершает работу с элементами коллекции, и для его использования понадобится вызвать ее вес на пере числителе. Несмотря на возможность явного создания и использования перечислителя, вместо него рекомендуется применять конструкцию Тагеаса. В этом случае придется писать меньше кода, что означает меньшую вероятность непреднамеренного внесения ошибок. Конечно, могут существовать веские причины для непосредственной манипуляции перечислителем.

Например, перечислитель может реализовывать специфичные методы, которые должны вызываться в процессе прохода по коллекции. Если необходимо манипулировать перечислением напрямую, всегда делайте это внутри блока пэ1па, поскольку 1Епомегасог<т> реализует 101зразаЬ1е. Обратите внимание,что поумалчанню вперечислнтельне встроеноникакихсредств синхронизации. Поэтомуодин поток может выполнятьперечисление элементовкаллекции, в то время как другой — модифицировать ее. Если коллекция изменяется в процессе ее перечисления,то перечиспитель становится семантически некорректным,и последующее его использование может привести к неопределенному поведению. Если необходимо предохранить целостность в таких ситуациях, то может понадобиться.

чтобы перечислитель блокировал коллекцию через объект, предоставляемый свойством Яупскоос. Очевидно, что блокировка должна быть получена в конструкторе пере- числителя. Кроме того, эту блокировку нужно где-то снимать. Уже известно, что для выполнения такой детерминированной очистки необходимо реализовать интерфейс 1П1эроззЬ1е. Именно в этом состоит причина реализации интерфейса 1вззроэаЬ1е 272 Глава 9 в 1епппегэсог<т>.

Более того, код. сгенерированный оператором гогезсь, создает "за кулисами" блок лгу/Г1лэ11у. который вызывает 01зрозе на перечислителе внутри блока 11па11у. Описанная техника в действии продемонстрирована в предыдущем примере. Типы, производящие коллекции Ранее уже подчеркивалось, что содержимое коллекции может измениться, пока перечислитель проходит по коллекции. Если коллекция изменяется.

это может сделать перечислитель недействительным. В следующем разделе, посвященном итераторам, будет показано. как создать перечислитель, блокирующий доступ к контейнеру на период перечисления. Хотя подобное возможно, это может оказаться не лучшим решением с точки зрения эффективности.

Например, что если на проход по всем элементам коллекции потребуется много времени? Цикл 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
Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7027
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее