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

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

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

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

Если подумать, то вы ничего не теряете, не имея такой возможности. Например, предположим, что вместо типа бупаш1с используется оЬ3 еос, и затем зти экземпляры оЬ3 есг преобразуются в бупаш1с в точке оперирования ими. Будет достигнут тот же самый эффект. Например, рассмотрим модифицированный код, иллюстРируюпцяй сказанное: 1пгегтасе 1хогх<т> ( чогб понос)с( Т ггеш )в ) с1ава С: 1Хогг<оЬ)есс> ( рпЬ11с чо1с( Оокогг( оЬ3есс гсеш ) ( бупаш1с б = Тсеям /( Завершить работу с (/ динамической сущностью. ) всасгс с1аяя ЯпсгуРо1пс ( ясас1с чогб Магп() ( С с = пеи С() ) с)упаш1с б = пеи оЬ)есс () с.ооког)с( б ); Этот пример демонстрирует, что, не имея возможности реализовывать динамические интерфейсы, вы ничего не теряете.

В методе Маап можно передать экземпляр с(упашас методу Ооког)с и внутри этого метода оперировать экземпляром с)упаш).с, даже не имея возможности указывать с)упашгс в качестве обобщенных аргументов, где С реализует 1Хогк<>. Для дальнейшей иллюстрации рассмотрим следующий пример: ия1пс Яуясеш; пв1пч Яуясеш.Со11ессгопя.оепег1с," с1аяв С ( ) всасгс с1авв Япсгурогпс ( всас1с чогб Маго() ( 151вг<с)упаш1с> шуь1вг = пен 11вг<бупаш1с> (); шуь1вс.лс(с(( пен С () ШУО1ВТ.АС)б( ПЕИ ОЬ)ЕСТ () ) ) ТогеасЬ( бупаш1с гсеш 1п шу)авс ) Сопво1е.кг1се11пе( 1сеш.аестуре() ); ) ) ) Динамические типы 575 Обратите внимание иа тип вуьуяс, Невозможность реализации 111яс<бупзв1с> ие означает, что нельзя объявить переменную типа 1Ь(яп<бупзвбс>.

Это еще раз иллюстрирует тот факт, что невозможность реализатщи динамических интерфейсов — вопрос спорный, поскольку необходимой цели можно достичь и без этого. Фактически, если в приведенном выше примере заменить все вхождения слова бупявбс иа оЬ] есС, иа выходе будет получен тот же результат: С Яуякев.ОЬ]есс Возможность наследования от динамических базовых типов После всего, что было сказано о невозможности использования бупав1с в качестве базового типа, и о том, что реализовывать динамические интерфейсы нельзя, может вызвать удивление тот факт, разрешается выполнять наследование от обобщенного базового типа, который имеет тип-аргумеит бупяв).с.

Что это зиачит? Рассмотрим следующий короткий пример: пз1пс] Буякепы с1яяя В<т> ( рпЬ11с т уз1пе ( цест яе.; ) с1азя С: В<бупзв1с> ( ) ягяк1с с1зяя Епкгуеоапк ( ягяк(с тсо1б Мяьп() ( С с = пеи С() т с.чя1ие = "СЕ кос)ся!"; Сопяо1е.игьгеьапе( с.ття1пе.пестуре() Почему такое возможно, несмотря иа то, что типы ие могут реализовывать динамические интерфейсы? Помните, что в случае динамических интерфейсов для компилятора ие существует способа издать атрибут, необходимый для обозначения того факта, что аргумент обобщения является с1утсзвус.

Но поскольку тип может быть унаследован от более чем одного типа, производный тип можно декорировать с помощью атрибута пупавусйссгт.Ьпсе, который указывает, что один или более обобщенных аргументов базового типа являются с)упзвв'.с. Ниже показано, как выглядит класс С в Нетас(ог: (Вупав1с(авв Ьоо1[] ( яа1за, Еепа )) ] 1псегпз1 с1аяз С: В<оЬ]еск> ( // Мекпобя рпваас С () ) ) Имейте в виду, что в коде, сгенерированном компилятором, атрибут Ьупавьс йс Ьг1Ьипе, декорирующий класс С,имеет пару перегрузок конструкторов. Одна из иих принимает тип Ьоо1(]. Массив Ьоо1 используется для обозначения того, какой из аргументов-типов относится к бупав1с. За дополнительной информацией об Пупав1сйсгг1Ьпее обращайтесь в докумеитацтпо МЗПХ.

876 Глава 17 Что означает возможность делать это, и дает ли она что-то большее. чем просто указание оЬ) есг в качестве аргумента-типа7 На самом деле кое-что дает. Рассмотрим следующую небольшую модификагшю метода Ма).п: яса11с с1авз Епсгуротпв ( зсас1с лоаб Магп () ( С с = пеиС()9 с.Ча1се = "СФ Носка)ь; Сопзо1е.Иг11ешпе( 42 + с.Ча1ие ); ) Обратите внимание на текст, выделенный полужирным. Поскольку с. Ча1це— зто динамическое выражение, то динамическим становится все выражение в вызове Сопзо1е.нг1се11пе.

Кзк и с любым динамическим выражением, встречающимся где бы то ни было, разрешение типа для него откладывается до времени выполнения. Более того, компилятор не может определить, какую перегрузку операции сложения следует вызвать, предварительно не разрешив типов, а потому этот выбор также откладывается до времени выполнения. Приведенный выше метод дает следующий результат: 4204 Косая! Заменив в предыдущем примере бупаштс на оЬ)есс, те.

сделав оЬ)есс типом-аргументом базового типа С, получится совершенно иной результат. На самом деле возникнет ошибка компиляции: еггог С90019: Орегасог 'ь' саппог Ье арр11еб Го орегапбя ог Гуре '1пс' апб 'оЬ)есс' ошибка СЯ0019: Операция ь не может быть применена к операндам типа бпс и обдесс Таким образом, возможность указания булан).с в качестве типа-аргумента обобщения в базовом типе удобна в некоторых ситуациях, когда необходимо вычисление динамического выражения во время выполнения.

Утиная типизация в СФ Утиная типизация (бис1г тур(пя; неявная динамическая типизация) — это когда тип объекта определяется поддерживаемым контрактом, а не действительными интерфейсами или базовыми типами, от которых он унаследован.

Утиная типизация распространена в некоторых библиотеках шаблонов С++, где можно делать нечто подобное следующему коду СФ, который не компилируется: О Это не компилируется!!! с1азз С<Т> ( зсас1с рпЬ11с чогб Оонога( Т гсеш ) ( Тсеш.эоногв(); ) ) При попытке компиляции этого кода выдается следующее сообщение об ошибке: еггог СЯ1061: 'Т' боев пос сопсатп а бегтп111оп Тот 'Ооиогк' апб по ехсепвтоп шеГЬоб 'Ооиогг' ассерсгпд а Тагес агдпшепс от Гуре 'Т' соп1б Ье Топпб (аге уоп шгвзтпд а пз1пд б1гесстле ог ап авзешЬ1у гегегепсе?) ошибка 001001: Т не содержит определения Оокогг, и не обнаружены расширяющие методы Оошог)г,которые принимают первый аргумент типа Т (возможно, пропущена директива ивбпд или ссылка на сборку) Динамические типы 577 Чтобы получить эффект, близкий к тому, который очерчен в приведенном выше коде, необходимо использовать ограничения обобщений.

Однако ограничения не обеспечивают утиную типизацию, поскольку при этом играют роль определения типов. Было бы неплохо иметь возможность вызывать, например, метод Ооыогх типа Т, каким бы этот тип ни был, при этом не требуя от Т реализации интерфейса. которая включает определение покат)с Ирония в том, что компилятор СЗ делает именно это. Рассмотрим следующий код: пвтп9 Яувтев; пвгп9 Яувтев.Со11есттопвк с1авв С ( рпЫтс 1Епиветвтог ОетЕппветатог() 1оп9 1 = 07 ип 1е( 1 < 10 уте1б гетпгп ++17 ) втвттс с1ввв Ептгуротпт ( втаттс чотб Матэ О ( С с = пеи С () 7 Ястаасв( тат Ьеав тп с ) ( Сопво1е.кг).те( ).тев + ", ) ) ) В результате запуска этого кода на выполнение на консоль выводятся следующие целые числа: 1, 2, 3, 4, 5, б, 7, 8, 9, 10, Функциональность показанного выше кода не слишком впечатляет, но в нем интересен фрагмент внутри оператора гогеасп, выделенный полужирным.

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

На самом деле компилятор просто компилирует вызов Яетхппвегатог на любом экземпляре. на котором выполняется итерация уогеасЬ. Если закомментнровать метод ОетЕппветатог и повторно скомпилировать код, то компилятор сообщит о следующей ошибке: егтог СЯ1579: Гогевси втвтевепт свппот орегвте оп чвттаЬ1ев от туре 'С' Ьесвпве 'С' боев пот сопта1п в рпЫтс бет1птт1оп тот 'ОетЕппвегвтог' ошибка СЯ1579: Оператор ГотевсЛ не монет работать на переменной типа С, поскольку С не содержит общедоступного определения Оеткппшегатог Такое поведение компилятора является блестящим примером утиной типизации в действии.

В конце концов, компилятору беаразлично,какой тнп передан Гогеасп,и реализует ли он какой-то интерфейс. Вместо этого он требует, чтобы в типе был реализован определенный метод с определенной сигнатурой. Однако до появления Св 4.0 данная возможность была практически недоступной в коде. 578 Глава (7 Теперь давайте посмотрим, как можно достичь того же результата с использованием типа бупав1с. Предположим, что добавляется новое средство к очень большому и зрелому приложению. Более того, в процессе тестирования выяснилось, что было бы исключительно полезно иметь возможность выводить в дами детальную информацию о состоянии объекта в журнал отладки, вызывая метод по имени Оиврзпапето. Поскольку это крупное приложение, в нем определены тысячи типов.

Иэ-за ограничений по времени невозможно определить новый интерфейс и рассчитывать на то, что все типы реализуют его. Поэтому рассмотрим, как это реализовать в С№, воспользовавшись типом бупавгс; ив1пс Бувгев; ив1по Бувпев.10; ив1по мгсгояогГ.СБЬагр.аипггвеВгпбег; с1авв С ( риЬ11с чогб ОиврзпапеТо( Техпкггпег Гн ) ( Гн.кг1пе11пе( "Состояние экземпляра " Бестуре() ); Гн.кггпе)ьпе( "1пиа1ие == " + Ча1ие ); ) риЬ11с 1опо Ча1ие ( оеп; веп1 ) ) с1авв О ( ) впапгс с1авв ЕппгуРо1пс ( впаг1с чогб Магп() ( С с = пеи С()1 с.иа1ие = 421 О б = пен О(); // Вывести некоторую отладочную информацию ОиврбеЪиф1пто( с ) 1 Оиврбепис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 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7056
Авторов
на СтудИзбе
258
Средний доход
с одного платного файла
Обучение Подробнее