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

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

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

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

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

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

470 Глаза 13 Поддерживают ли значения етого типа какие-то интерфейсы? Разница в поведении между типами значений и ссылочными типами внутри СЬН иногда может служить причиной путаницы, особенно для новичков в СЬН и Сэ. Это обычно связано со сложностями взаимодействия двух миров — мира ссылочных типов и мира типов значений. Учтите тот факт, что все типы значений (структуры) неявно наследуются от Бузгея.

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

Явно создать экземпляр этого типа нельзя, но он создается неявно при инициации операции упаковки на экземпляре значения. Когда СЬЙ создает этот внутренний тип упаковки во время выполнения, она имеет доступ ко всей информации, которая необходима для эффективной реализации всех методов, поддерживаемых типом значений, а реализация метода просто перенаправляет вызовы копии типа значения, которая содержится во внутреннем типе.

Кроме того. динамически сгенерированный упаковочный тип также реализует все интерфейсы, реализуемые этим типом значений. Таким образом, ссылки на экземпляры этого динамического упаковочного типа, который является ссылочным типом, могут быть приведены к ссылкам на реализуемые интерфейсные типы, как это принято для ссылочных типов. Но что происходит, когда экземпляр типа значения приводится к типу интерфейсау Сначала значение должно быть упаковано.

Это имеет смысл, если учесть то, что ссылки на интерфейс — это всегда ссылки на ссылочный тип. Неудобства, которые несет с собой упаковка в СФ, уже известны. Они объясняются тем, что упаковка осуществляется автоматически, помогая выйти из затруднения.

Если не известно, что происходит "за кулисами" данного процесса, может возникнуть еще большая путаница. из-за того, что по невнимательности значение внутри упаковки будет изменено и затем отброшено без распространения изменений из упакованного значения на исходное значение. А каким образом модифицировать значение, находящееся в упаковке? Если привести экземпляр упаковки обратно к его типу значений, то получится новая копия значения в упаковке. Поэтому не пытайтесь выполнить этот трюк. Необходимо как-то добраться до внутреннего значения упаковки.

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

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

Пример того, как это делается, можно найти в разделе "Упаковка и распаковка" главы 4. е поисках канонических форм С№ 471 Реализация безопасных к типам версий для членов интерфейса и унаследованных методов В разделе "Всегда отдавайте предпочтение безопасности типов" данная тема уже рассматривалась в контексте ссылочных типов. Большинство положений применимо и к типам значений, но с учетом некоторых соображений эффективности.

Проблемы эффективности произрастают из явных операций преобразования из типов значений в ссылочные типы и наоборот. Как известно, эти преобразования приводят к скрытым операциям упаковки и распаковки в сгенерированном коде !Ь. Во многих ситуациях операции упаковки могут легко свести на нет всю эффективность. Замечания, сделанные ранее относительно того, что безопасные к типам версии методов перечисления помогают компилятору С№ создавать более эффективный код в цикле ТогеэсЬ, в десятикратной степени касаются типов значений.

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

1пс32 также поддерживают такие интерфейсы, как 1СоврагаЬ1е. С точки зрения эффективности упаковывать тип значения при каждом сравнении его экземпляров, не нужно. Фактически, в том виде, как он написан, следующий код упаковывает оба значения: риЬ11с кок№ Мэгп( ( Совр1ехипвпег Совр1ехипвЬег гпк геэп1Г = ( ) ппв1 = пеи Совр1ехипвЬег( 1, 3 ппв2 = пеи Совр1ехкпвЬег( 1, 2 ); (1СоврагаЬ1е)ппв1).СоврагеТо( ппв2 пэ1по Яузкев) рпЫгс экгиск Совр1ехнпвЬег: 1СоврагаЬ1е, 1СоврагаЬ1е<Совр1ехивхЬег>, 1ЕЧпакаЬ1е<Совр1ехнэвЬег> ( риЫгс Совр1ехипвЬег ( с)опЫе геа1, «)ппЫе 1вадтпэгу ) ( ГПТэ.геа1 = геа1; ГЫэ.квадхпагу = гвасгпагу; ) рпЬ11с Ьоо1 ЕЧпа1э ( Совр1ехипвЬег окпег ) ( гегпгп (Гпгэ.геа1 == окпег.геа1) аа (ГЫэ.ьвачгпагу == окпег.1вэдгпагу); Можете ли вы распознать здесь обе операции упаковкир Как было показано в предыдущем разделе, экземпляр пив1 должен быть упакован для того, чтобы получить ссылку на интерфейс 1СоврагаЬ1е.

Кроме того, поскольку СоврагеТо принимает ссылку типа я уз сев. Оь) есг, экземпляр и ов2 также должен быть упакован. Это губительно сназывается на эффективности. Формально для вызова через 1СоврагаЬ1е упаковывать ппв1 не обязательно. Однако в предыдущем примере класс Совр1ехнпвпег реализовывал интерфейс 1СоврагаЫе явно, поэтому не было выбора. Чтобы решить эту проблему, можно реализовать безопасную к типам версию метода Соврагето и в то же время реализовать метод 1СоврагаЬ1е.СоврагеТо.

Если применить такой прием, то вызов сравнения в показанном выше коде не инициирует никаких операций упаковки. Давайте посмотрим. как для этого должна быть изменена структура Совр1ехкэвЬег: 472 Глава 13 риЬ11с очегг1бе Ьоо1 Ес)иа1з( оЬ)ест отпег ) ( Ьоо1 гези1С = Та1зел 1Т( отпег тз Совр1ехвшвЬег ) ( Совр1ехвивпег спас = (совр1ехмивЬег) осьег геви1С = Ет(иа1з( Спат )) ) тетигп геви1С; ) риЬ1тс очегттбе тпт ЗетаавЬСобе() ( гетигп (тпт) Спал.мацпатибе) ) риЬ1тс втат1с Ьоо1 орегатог ==( Совр1ехвшвЬег пив1, Совр1ехвивЪег пив2 ) ( гетитп пив1.Ес(иа1в(пив2); ) риЬ1тс зтаттс Ьоо1 орегаСог !=( Совр1ехИивпег пив1, Совр1ехЯивЬег пив2 ) ( гетигп !пив1.Ециа1з(пив2)) ) риЬ11с Тпс Соврагето( Совр1ехвшпЬег Спат ) ( Тпт геви1С) ТТ( Есиа)з(таас) ) тези1С = О) ) е1ве 1Т( СЫз.Масп1тибе > спаС.Маопстибе ) ( геви1С = 1; ) е1зе ( теви1С = -1; гетигп гези1ту ) 1пС ТСоврагаЫе.бшврагеТо( оЬ)еоС оСЬег ) ( 1Т( ! (отпег 1в Совр1ехвивЬег) ) ( сьтон пен Атдивепсехсерссоп( "неверное сравнение!" )( ) гетитп СоврагеТо( (Совр1ехвивЬег) отпег ); ) риЫтс боиЫе Маоп)тобе ( сес ( гетигп МаСЬ.Яс)гт( МаСЬ.Рон(СЬТз.геа1, 2) Матс.рон(тптв.свадтпагу, 2) ); ) // Прочие методы опущены для ясности.

рг1чате геабоп1у боиЫе геа1; рг1чате теабоп1у боиЬ1е 1вадгпагу) ) риЫтс веа1еб с1азя Ептгуроапт ( втаттс чогб Ма1п() ( Совр1ехнивпег пшп1 = пен Совр1ехривЬег( 1, 3 ); Совр1ехЯивпет пив2 = пен Совр1ехвивЬег( 1, 2 ); тпт гези1С = пив1.СоврагеТо( пив2 ); // Попробовать безопасную к типам версию. теви1С = ((1СаврагаЬ1е)пив1).СоврагеТо( пив2 )ю ) ) о поисках канонических форм СЗ 473 После модификаций первый вызов СовратеТо в методе Ма[о не инициирует операции упаковки. Также обратите внимание, что метод ТСовратаЬ1е. Совратето реализован явно. Это затрудняет непреднамеренный вызов безтиповой версии 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 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7045
Авторов
на СтудИзбе
259
Средний доход
с одного платного файла
Обучение Подробнее