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

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

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

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

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

Применяя пямбда-выражения, удается полностью исключить необходимость в определении методов операций, таких как мп1ЬТР1у1пг64, Ас(г(1ппб4 и роиЬ1еТо1пгб4. 350 Глава 11 Теперь предположим, что экземпляры Совр1ех<Т> будут использоваться э качестэе нлючеэых значений з обобщенном типе яоггебьбят<ткеу, тча1ие>.

Для этого тип Совр1ех<Т> должен реализовать 1СоврагаЬ1е<Т>.Посмотрим,что понадобится сделать,чтобы это стало возможным. изтпд Бузтезп риь11с зтгист совр1ех<т>: 1соврагаые<совр1ех<т» ньеге т: ятгист, Тсопчегтть1е, 1совратаь1е ( // делегат лля выполнения умножения. риЬ11с бе1едате Т Втпагуор( Т ча11, Т ча12 ); риЫ1с Совр1ех( Т теа1, Т 1вадтпагу, Втпагуор ви1Г, Втпатуор абб, Сопчегтет<боиЫе, Т> сопчТоТ ) ( тиьз.геа1 = теа1; тЫз.твадупагу = таад>пату) тптз.ви1т = ви1т) тЫз.абб = абб; тпьз.сопчТоТ = сопчТоТ) риЬ1тс Т Веа1 ( дет ( гетигп геа1) ) зет ( теа1 = ча1ие; ) ) риЬ1).с Т 1вд ( дет ( гетигп 1вад1пагув зет ( Твадбпагу = ча1ие) ) ) риЫ1с Т Мадпттибе ( дет ( боиЬ1е вадпьтибе = Мати.ядгт( Сопчегт.ТопоиЪ1е(абб(ви1т(геа1, теа1), ви1Г(твадтпату, Твадтпагу))) )) гетигп сопчТоТ( вадп1тибе ) ) риь1ьс 1пе соврагето( совр1ех<т> оеьег ) ( геаит Мадп1сибе.

Соярагето ( огнег. Мадпьси~ ) ргучате Т геа1) рг1чате Т 1вад1пату1 ргтчате Вбпагуор ви1т) ргтчате Втпагуор абб; ргтчате Сопчегтег<боиЫе, Т> сопчТоТ; ) риЫТс с1азз ЕптгуРотпт ( зтат1с чотб Маьп() ( Совр1ех<1птб4> с = пен Совр1ех<1птб4>( 3, 4, ЕпттуРоьпт.Ми1т1р1у1птб4, Обобщения 351 ЕпггуРо1пг.йс(с(1пС64, ЕпгтуРо1пг.оооЬ1еТо1пС64 )) Сопво1е.игтгеьгпе( "Модуль равен (О)", с.Мадпугосе )4 вгаггс 1пгб4 Мо111р1у1пгб4( 1пгб4 ча11, 1пг64 ча12 ) ( тегогп ча11 * ча124 ) вгаггс 1пгб4 йсо1пС64( 1пС64 ча11, 1пгб4 ча12 ) ( гегогп ча11 а ча12; ) вгагтс 1пгб4 ОооЬ1еТо1пС64( оооЬ1е с( ) ( геготп Сопчегг.То1пС64( с( ); ) ) овапд Яувгевя ив1пд Зузгеп.

Со11есС1опв. Сепег1с) роь11о всгосс сопр1ех<т>: 1сопратаЪ1е<сопр1ех<т» вьете Т: вегпсС ( /I Делегат для выполнения умножения. роЬ11о с(е1адаСе Т Втпагуор( Т ча11, Т ча12 ); РоЬ11о Совр1ех( Т геа1, Т Тпадтпагу, Вгпатуор по1С, Втпагуор аоо, Сопчеггег<оооЬ1е, Т> сопчТОТ ) ( Сйтв.геа1 = геа1) СЬ1в.1пад1пагу = Тпадгпату; СПТв.во1С = вп1С4 сп1в.аоо = аооя опта.сопчТОТ = сопчТОТ) ) рогтус Т дес ( вес ( ) рог11с Т дас ( вес ( Веа1 ( тесогп геа1; ) геа1 = ча1ое) ) 1вд ( гегогп гпадтпатуя Твадтпагу = ча1ое; В приведенной реализации интерфейса 1СопрагаЬ1е<Совр1ех<Т» два типа Совр1ех<Т> рассматриваются как эквивалентные, если у них одинаковое значение модуля.

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

поддерживать только 1СовратаЬ1е, ане 1СопратаЬ1е<Т>. Еще одна вещь, которую стоит упомянуть: предыдущее ограничение по необобщенному интерфейсу 1СоврагаЬ1е несколько затрудняет для Совр1ех<Т> хранение обобщенных структур, поскольку обобщенная структура может реализовывать вместо этого 1СовратаЬ1е<Т>. Фактически, при текущем определении невозможно указать тип Сопр1ех<Совр1ех<гпг». Было бы неплохо, если бы Совр1ех<Т> конструировался из типов, которые могут реализовывать 1СоврагаЬ1е<Т>, или 1СоврагаЬ1е, или даже оба сразу.

Давайте посмотрим, как это сделать. 352 Глава ! ! рпЬ11с Т Маоп1гсг(е ( дес ( оосЬ1е ваоп1Спсе = МаГЬ.ЯЧгс( Сопчегс.ТооопЬ1е(асс(ви1С(геа1, геа1), вс11(1ваэ1пагу, 1ва01пагу))) ) 1 геспгп сопчТоТ( васп1спсе ); ) ) рпЬ11с Тпг соврагето( совр1ех<т> агьег ) ( геепгп Соврагег<Т>.оевап1С.Совраге( ЕЬав.мавп1еог)е, осиек.иарп1воде ) ) рггчасе Т геа1; Рг1чате Т гвасгпагуг рггчасе В1пагуор вп1Г; рггчасе Вгпагуор асс; рг)таге Сопчегтег<г(оиЬ1е, Т> сопчтот~ рпЬ1>с с1аэз ЕпсгуРогпс зсасгс ча1О Ма1п() ( Совр1ех<1пт64> с = пен Совр1ех<1псб4>( 3, 4, ЕпсгуРо1пт.но161р1у1пгб4, ЕпсгуРо1пГ.АОО1пк64, ЕптгуРо1пс.оопЬ1ето1пт64 ); Сопэо1е.нггтеьапе( "Модуль равен (0)", с.Мадпзспсе ) аеасас чо1а роввув(ееао4)( Совр1ех<Совр1ех<1пс» с ) ( ) зкат1с ТпГ64 АОО1пк64( 1пкб4 ча11, 1птб4 ча12 ) ( гесогп ча11 + ча12; ) зтаг1с 1пс64 Ми1Г)р1у1пкб4( 1птб4 ча11, 1пс64 ча12 ) гегпгп ча11 * ча121 ) зсат1с 1псб4 ОопЬ1еТо1псб4( ОопЬ1е О ) ( гетпгп Сопчегс.то1пт64( О )> ) ) В этом примере было удалено ограничение на Т, требующее реализации интерфейса 1Совра гаЬ1е.

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

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

Фактически он есть, и будет гораздо лучше, если предоставить Соар1ех<Т> еще один конвертер в форме делегата сопчегс<т, <)опЬ1е> в конструкторе, как показано ниже: пя1пд Яуягезн пя1пд Яуягеи.со11есг1опя.сепег1сг рпЬ1гс яггпсс Соир1ех<Т>: 1СоирзгаЬ1е<Соир1ех<Т» нпеге Т: яггпсс ( уу делегат для выполнения умножения. рпЬ1гс г)е1едзге Т Вгпагуср( Т чв11, Т ча12 ); рпЬ1гс Соар1ех( Т геа1, Т гиадгпвгу, Вгпагуор ас11, В1пагуор вог(, Сопчегеег<Т, т)ооЬ1е> сопчторопЬ1е, Сспчегсег<оопЪ1е, Т> сопчТоТ ) ( гпгв.геа1 = геа1; СЬТя.1иад1пагу = гиадгпагуг ЬЬ(я.ип1Г = ип11; Сиув.асс = асс; ГЬ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кпое )) ) рпЬ11с 1пь соарагето( соар1ех<т> огпег ) ( гегсгп Соарагег<Т>.сегас1Ь.сопрете( ГЬ1в.надп1спое, огпег.иадп1сспе ) ) рг1чаге Т геа1р рг1чаге Т 1иад1пагуг 354 глава (( Рггчасе Вгпагуор еп1Г~ рггчапе Вгпагуор абб; рг1часе Сопчегсег<Т, бооЬХе> сопчТовооЬ1е) рггчаге сопчеггег<бопЬ1е, т> сапчтотв ) рпЬ11с с1аяя ЕпсгуРо1пГ ( ясапгс чо1б Магп() ( Сопр1ех<1пГ64> с = пен Соер1ех<1пГ64>( 3, 4, Еппгурогпг.мп1ггр1у1пГ64, ЕпсгуРотпс.лбб1п<64, Епсгуровпс.гпс64ТовочЬХе, ЕпсгуРогпГ.ОоеЬ1еТо1пГ64 ); Сопяо1е.иг1геьвпе( "Модуль равен (0)", с.Маоп1Гпбе ); ягаг1с чогб Оппнпумегьоб( соар1ех<сопр1ех<1пг» с ) ( япасгс ХпГ64 Мп1Ггр1угпГ64( Хпп64 ча11, ХпГ64 ча12 ) ( геспгп ча11 * ча12~ ) япапгс 1пГ64 Абб1пГ64( ХпГ64 ча11, 1пГ64 ча12 ) ( гесигп ча11 + ча12; ) япас1с 1пг64 ОопЬ1еТо1пГ64( бопЬ1е б ) ( геппгп Сопчегп.То1пс64( б ); ) ясаг1с бопЬХе ХпеввтовоиЬ1е( Хпс64 х ) ( гесигп Сопчегс.ТовопЬ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
Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7054
Авторов
на СтудИзбе
259
Средний доход
с одного платного файла
Обучение Подробнее