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

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

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

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

рпь11с чо1б Або<Я>( мусопсагпег<я> осьегсопсагпег, сопчетсег<е, т> сопчетсег ) ( йогеась( Е Ьпещ Ьп оСЬегСоптаьпег ) ( 1щр1.Абб( сопчеттет(ЬСещ) ); ) роь11с 1еппщегасог<т> Оесепотегасог О ( тогеасЬ( Т 1гещ ап сщр1 ) у1е1б геппгп 1Сещ; яуятещ.Со11есг1опз.1Епчщегатог яуягещ.со11есгсопя.1ЕпощегаЬ1е.оеСЕппщегатог О ( гегигп ОеСЕппщегагог(); ) ргачасе ьбяс<т> Ьщр1 = пен ь1яс<т>()~ ) роЬ11с с1аяя ЕпггуРоапт ( япаС1с чобб Мата() ( Мусоппа1пег<1опо> 1СопСа1пег = пен Мусопса1пег<1опо>()п МуСопга1пег<апг> 1Соппаапег = пен МуСоппа1пег<1пт>(); 1Соптаупег.йбб( 1 )) 1Сопга1пег.Абб( 2 ); 1Соппаспет.йбб( 3 ); ЬСопгаьпег.Абб( 4 1СопгаЬпег.Абб( 1Соптаапег, ЕпотуРоапС.1пСТоьопЯСопчегтег ); готеась( 1опд 1 ап 1Соптагпег ) ( Сопзо1е.нгстеьспе( 1 )и ] ) ягатьс 1опд 1пптоьопосопчегпег( тпС 1 ) ( геспгп 1; 318 Глава 11 Прежде всего, обратите внимание на обобщенный метод АтЫ<е>, а также на то, что в МуСопгаьпег<Т> есть две перегрузки Абгь Ясно, что нужен метод для добавления экземпляров типа Т вЂ” отсюда необходимость в АсЫ1 Т ) .

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

Объекты, содержащиеся внутри экземпляра МуСопса1пег<гпг>, требовалось поместить в экземпляр МуСопгаьпег<1опд>, Поэтому был создан обобщенный метод АСЫ<е> для того, чтобы позволить принимать любой контейнер. содержащий в себе произвольные типы. Поскольку обобщенный класс использует Т в своем списке аргументов, обобщенный метод использует Е, чтобы избежать сокрытия параметра типа. Такой прием, однако, требует ухищрений. Логически то, что делается, имеет очевидный смысл.

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

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

Это объясняет потребность в методе 1пстоьопйсопчегеег в предыдущем примере. Метод Асы<е> затем использует этот делегат для выполнения преобразования от одного типа к другому. В данном случае преобразование неявно. но оно должно было быть вынесено наружу, поскольку во время компиляции компилятор должен учесть тот факт, что метод Аьщ<й> может принять любой тип. На заметку! В версии СФ 4.0 появился новый синтаксис длл пометки интерфейса или делегата ковариантным или контравариантным. Этот новый синтаксис подробно рассматривается в разделе "Ковариантность и контравариантностьд далее в главе.

В зависимости от ситуации, если типы Т и А неявно преобразуются друг в друга, то определять делегат-конвертер, как показано выше, не обязательно. Для облегчения перечисления контейнера также объявлен МуСогеазпег<Т>, реализующий 1ЕпошегаЬ1е<Т>. Это позволит применять синтаксически интуитивно понятную конструкцию Ео ге а со. Некоторый синтаксис здесь может показаться незнакомым, если вы не имели дело с итераторами СВ, особенно с оператором уге 1<1 '.

Обратите внимание, насколько легко создается перечислитель для этого класса с помощью ключевого слова узе 1<1. ' Тема итераторов полностью раскрывается в главе Е< Если интересно. зачем нужна явно реализованная версия осьепчвегаког, которая возвращает необобщенный тепчвегзьот, то причина в там,что тепчэегаЬ1е<т> наследуется от тепсаегаЬ1е. Обобз(з 319 Зто полезное дополнение языка, поскольку объявление и конструирование объектов, пе- речисляющих содержимое контейнеров — традиционно трудоемкая работа.

Обобщенные делегаты Обобщения довольно часто используются в контексте контейнерных типов, где поле закрытого типа или внутренний массив основан на заданном аргументе типа. Обобщенные методы расширяют способность обобщенных типов, предоставляя более тонкую структурированность обобщенного контекста. Далее еще пойдет речь о мощи обобщенных делегатов. Вы уже знакомы с многоуважаемым делегатом. Если необходимо объявить делегат, принимающий два параметра, первый из которых имеет тип 1опс, а второй — оьб асс, то следует поступить так: риЬ11с Се1есзге чо1о Мупе1есасе( 1опс 1, оЬ1ЕСС о ) В предыдущем разделе приводился пример обобщенного делегата, когда был показан делегат для преобразования типов. Объявление такого обобщенного делегата для преобразования выглядит следующим образом: риЬ11с Пе1едаге ТОигрсс Сосгеггег<Т1срсг, ТОигрсе>( Тгпрсг Тсраг )' Он похож на любой другой делегат, но с тем отличием, что сразу за его именем следует список параметров-типов.

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

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

Для удобства ниже еще раз показан код метода Ма1о из этого примера: згаггс чогб Маго() ( мусосса1сег<1осо> 1соссагпег = лез мусосса1оег<1осс> О ~ Мусосгаглег<1се> ТСоогагпег = лез МуСссса1сег<гпе>(); 1Сосса1сег.лс(с(( 1 1сопсэ1сег.лес( 2 ); 1Сссеагпег.Асс( 3 )! ТСосеа1сег.АСС( 4 )> 1Сосса1пег.лс(с(( ТСосеагсег, Еоггугогпг.1сСТоЬолЧСопгегеег )1 Тогеасл( 1оос 1 1с 1Сосгатсег ) ( Сосзс1е.нгггеЬ1пе( 1 )) Обратите внимание, что второй параметр метода АсЫ вЂ” просто ссылка на метод, а не явное создание самого делегата.

Зто работает благодаря групповым правилам преобраэо- 320 Глава 11 ванна, определенным в языке С(). Когда действительный делегат создается из метода. то закрытый тип выводится из обобщения с использованием сложного алгоритма сопоставления типов параметров самого метода 1пстоОопдсопоеггег. Фактически вызов Абб<е> лишен какого-либо явного списка параметров типа в точке вызова.

Компилятор в состоянии выполнить ту же работу по сопоставлению типов, чтобы вывести закрытую форму вызванного метода Абб<е>, которой в данном случае будет А<Ы<1пс >. Можно также с успехом написать код, подобный приведенному ниже, в котором каждый тип указан явно: яяая1с яо1б Мага() мусопга(шег<1опд> 1сопга1пег = пея мусопга1пег<1опд>()~ Мусопяа1пег<1пс> 1Сопсагпег = пея Мусопяа1пег<1пя>()) 1Сопсаупег.Абб( 1 ); 1Сопсагпег.Абб( 2 ); 1Сопсагпег.лбб( 3 ); РСопса1пег.Абб( 4 ); 1Сопяагпег.Абб<1пг>( ТСопгагпег, пея Сопяегсег<гпя, 1опд>( ЕпягуРо1п1.1пятоьопдсопуегяег) ) Гогеасп( 1опд 1 Тп 1Сопяаьпег ) ( Сопяо1е.нгуяе( Тпе( 1 ); ) ) В этом примере все типы заданы явно, и компилятору не приходится выводить их во время компиляции.

В любом случае, результирующий код (Ь будет одним и тем же. В большинстве случаев можно полагаться на механизм определения типа компилятором. Однако, в зависимости от сложности кода, иногда может иметь смысл помочь компилятору, передав явный список параметров-типов. Наряду с обеспечением возможности вынести преобразования типов за пределы класса контейнера, как в предыдущем примере. обобщенные делегаты помогают решать специфичные проблемы, что демонстрируется в следующем коде: ЭТО НЕ РАБОТАЕТ, КАК ОЖИДАЕТСЯ((( оя1пд Буясеау пяупд яуяяеа.со11ессгопя.оепег1с; ровугс бе1едасе яогб Муве1едасе( Рпя 1 ); рпЬ11с с1аяя Ое1едаяесопяа1пег<Т> ( роЬ1гс яогб Абб( Т бе1 ) ( 1пр.А<Ы( бе1 ); ) роЬ11с яо1б Са11Ое1едагея( 1пя К ) Гогеасп( Т бе1 Рп 1пр ) ( УУ бе1( А ); ) ) рг1яаге 11яг<т> Тир = пее 11яг<т>() ) роЬТРс с1аяя Епсгурогпг ( яяая1с яо1б Ма1п() ( Ое1едасеСопгагпег<Мусе1едасе> бе1едаяея пея Ое1едасесопса1пег<Мупе1едасе>()~ бе1едасея.лбб( ЕпсгуРогпС.Рггпя1пс )( ) яяас1с яо1б Рг1пс1пс ( 1пс г ) ( Сопво1е.иггяеьгпе( 1 ); ) Обобщения 321 В таком виде, как он написан, этот код скомпилируется.

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