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

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

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

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

применение ключевого слова сыз для статического метода. объявленного в статическом классе, является способом сообщить компилятору. что данный метод является расширяющим. В завершении Ма1п видно, что метод ЯепбТоьод можно использовать точно так же, как любой другой статический метод. Фактически расширяющие методы не предоставляют никакой дополнительной функциональности сверх обычных статических методов.

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

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

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

Как известно, для использования типов, определенных внутри пространства имен, импортировать его вовсе не обязательно. Например, в приложении можно применять тип Яузгелг. Сопзо1е, не импортируя пространство имен Яузгев, но указывая полностью определенное имя. Однако для удобства обычно пространства имен все-таки импортируются. Аналогично, для того, чтобы можно было вызывать расширяющие методы с использованием синтаксиса вызова методов экземпляра, потребуется импортировать пространство имен.

На заметку! Начиная с С№ 3.0, импорт пространства имен, как более удобный способ обращения к типам внутри него, дает один побочный эффект, если пространство имен содержит расширяющие методы. Более подробно об этом речь пойдет в разделе "Рекомендации по использованию" далее в главе. При вызове метода экземпляра компилятор ищет тип с совпадающим методом экземпляра. Если в результате поиска подходящие методы не обнаруживаются, компилятор начинает искать соответствующие расширяющие методы. Он начинает с просмотра всех расширяющих методов, объявленных в самом внутреннем включающем пространстве имен, включая импортированные пространства имен, и если не находит подходящего, рекурсивно продолжает поиск в следующем включающем пространстве имен вплоть до глобального.

Если подходящий метод найти не удалось, компилятор ос- Расширяющие методы 479 танавливается и сообщает об ошибке компиляции. И наоборот, если текущее пространство имен имеет более одного подходящего импортированного метода расширения, компилятор выдает ошибку, сообщающую о неоднозначности. В таких случаях следует вернуться к вызову этого метода как обычного статического. указав его полностью определенное имя. На заметку! На самом деле процесс поиска имени несколько сложнее. Если экземпляр, на котором вызывается расширяющий метод, содержит свойство с тем же именем, компилятор обнаружит зто свойство и выдаст ошибку, сообщающую о попытке вызова свойства как метода. Рассмотрим следующий пример. иллюстрирующий все эти моменты: изупч Яузсем; риЬ11с зсас1с с1аяз Ехсепв1опиеспобв ( ясас1с риб11с ио1б Иг1сеьэпе( Гиэз Ясгзпд всг ) ( Сопзо1е.ыг1те11пе( "Глобальное пространство имен: " в всг ) ) ) павеврасе А ( риЬ11с всастс с1авз Ехсепввопмеспобз ( згаг1с риь11с иоьб игагеьтпе( гьэв Бгг1пя згг ) ( Сопво1е.нгтсеьэпе( "Пространство имен А: " + зсг ); ) павеврасе В ( риЬ11с всас1с с1авв Ехсепятопмеспобз ( всас1с риЬ11с иота Игасеьэпе( Гбэв Бсгупд зсг ) ( Сопво1е.нг1сеьэпе( "Пространство имен В: " + всг ) ) ) ) павезрасе С ивтпд А; риЬ11с с1азз Еар1оуее ( рибуас Евр1оуее( Бсгтпд паве ГЬ1в.паве = пате; риЬ11с иогб ргтпснаае() ( паве.нгтсе11пе(); ) ргзиасе Ясгтпо паве; ) ) пап1еярасе О ( из1пч В; рибгзс с1азв Под 480 Глава (4 рпЬ1гс Оод( Ясггпд пате ) ( ГЫз.паве = паве; рпЫ1с тога Рггпскаае() ( паве.Игуее) Рпе (); ргьтасе Ясггпд паве; ) ) паяезрасе Е ( рпЫгс с1азз Сас ( рпЫТс Сап( Ясгупд паве ) ( ГЫз.паве паве~ ! рпЫгс то16 Рг1пскаае О ( паве.иг1се11пеО; ) рг1таге Ясг1пд пааеу ) пааезрасе Оеао ( пз(шд А; пз).пд Ву рпЬ1гс с1азз ЕпегуРогпс ( зсасус тоьб Мауп() ( С.Еар1оуее Тгеб = пен С.Еар1оуее( "Ргеб" ) О.Оод Гпог = пен О.Оод( "ТЬог" ); Е.Сас зу1тезсег = пен Е.Сас( "Яу1незсег" ) Тгеб.уг1пснаае()~ Гпог.Рг).пскаае()) зу1тезсег.уг1пснаае()~ // Ясггпд зсг = "Ееопгге") // зсг.вг1сеьвпе О; В данном примере один и тот же расширяющий метод иг1геьапе объявлен в трех разных пространствах имен (А, в и глобальное пространство имен).

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

Аналогично, так как пространство имен Р импортирует пространство В, вызывается метод расширения Хг1сеь1пе из пространства В. Поскольку пространство Е не импортирует ни А, ни В, поиск продолжается в глобальном пространстве имен, которое также имеет собственную реализацию метода расширения хг1ге1,1пе. И, наконец, обратите внимание на закомментированный код в конце метода Магп. Если убрать комментарий и попытаться скомпилировать код, компилятор сообщит, что не может определить, какой метод ХггсеЬ].пе должен быть вызван, поскольку пространство имен веко импортирует оба пространства — А и В.

Пример подчеркивает опасность неправильного использования этого нового синтаксиса. Что происходит нза кулисами" Как же компилятор реализует расширяющие методы2 Поскольку они представляют собой просто синтаксические сокращения, никаких модификаций в исполняющей системе для поддержки методов расширения не потребовалось. Вместо этого компилятор целином реализует методы расширения через метаданные. Ниже приведен код 1Ь метода Ех сене ьопМес])ог]з . Хгьсевьпе из глобального пространства имен, сгенерированного при компиляции предыдущего примера: .аесьоб рпЪ11с ПьбеЬуз19 зсаогс чоьб Хгььевьпе(зтгьпо эсг) с11 тэпачеб ( .сиегсв 1пзгапсе чоьб [Вуэсев.Сохе]вуэгея.дспсаяж.Ссвр11егвегч1сеэ.

Вхгепзьспдссгьвоее::.сгог(] = ( 01 00 00 00 ) // Собе з1ге 19 (Ох13) .тэхзгэс)т 8 1Ь ОООО: пор 1Ь 0001: 1бзег "Глобальное пространство имен: 1Ь 0006: 1багд.о 1Ь 0007: са11 зег1пч (тзсог11Ь]зузсет.зьг1пч::Сопсэе(зпгьпо, з ггпч) 1Ь Ооос: са11 чогз (тзсог11Ь]Бузсет.Сопзо1е::ХгьееЬгпе(эсгьпо) 1Ь ОО11: пор 1Ь 0012: тес ] !/ епб ог несьоб Ехтепэьопнетиобз::Хг1ГеЬгпе Выделенный полужирным текст разбит на две строки, чтобы уместиться на странице. В нем видно, что метод снабжен новым атрибутом — Ехсепз]опдссгьбпсе, который определен в пространстве имен Бузгеш. Вппггше.

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

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