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

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

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

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

546 Глава (б При использовании Ы(ЧЯ (о БОЬ тела конструкций ЫЫЯ, которые сводятся к лямбдавыражениям. представляются деревьями выражений. Эти деревья выражений затем служат основой преобразования всего выражения в оператор БЯЬ для запуска на сервере. В случае ЫХЯ (о ОЬ)ес(я вместо этого лямбда-выражения преобразуются в делегаты в форме кода! Ь.

Ясно, что для Ы(((Я !о БЯЬ это неприемлемо. Только представьте себе, насколько трудным было бы преобразование кода 1Ь в БЯЬ? Как известно, конструкции Ы(хЯ превращаются в вызовы расширяющих методов, реализованных либо в Еуя Сею. Ьзпц. ЕпсюегаЬ1е, либо в Буя Сегя.

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

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

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

Плавный интерфейс этого списка выглядит следующим образом: риЫТс тпсеггасе 111яг<Т> ( Т Неао ( оег; 1дзяг<Т> Тзьа ( оеш ) ) В главе 14 также была продемонстрирована возможная реализация коллекции на основе этого типа. Для удобства она повторяется ниже: риЫТс с1аяя Мувьяг<Т>: 1Ьзяг<Т> роЬ11с ягагас ТЬТяг<Т> Сгеэге11яг( 1ЕпитегаЫе<Т> 1геия с(НО: язык интегрированных запросов 547 1епиеегасог<т> Тсег = 1сеав.сесепивегасог()т тетигп Сгеатесавс( Тсег )! ) риытс всасас 1ьбвс<т> сгеасеььвс( 1епивегасог<т> 1сег ) 1й( !1 ег.Мочеыехт() ) гесигп пен муеьвс<т>( бейаи1с(т), пи11 )т ) теситп пен му11вс<т>( 1сег.сиггепс, сгеасеьтвс(ьсег) ) ) рг1часе муеаяс ( т ьеаб, 1ььвс<т> са11 ) Спья.пеаб = Ьеаб) СЫв.тат1 = Са11! ) риЬ1гс Т Неаб ( дес ( гетигп Ьеаб; ) ! риЫтс 1ьавт<Т> Та11 ( дес ( гетигп Са11) ) ) рг1чате Т Ьеаб) рг1чате 111вт<Т> Са11; Теперь предположим,что необходимо реализовать стандартные операции запросов ипате и яе1есс.

На основе реализации муьавс зти операции могут быль закодированы так.' риЫтс вгагтс с1авя МуьавСЕхтепвгопя ( риЫхс втаттс 1ЕпиаегаЬ1е<Т> Сепега11Сегатог<Т>( Сптв 1ьаяС<Т> СЬессзт, Гипс<111вт<Т>, Ьоо1> Хапа1БСате, Гипс<1ььвт<Т>, 111вт<Т» 1псгевептег ) ( ньт1е( )йапа1ясасе(сьеь1вс) ) ( уте1б гегигп Спе11зС.Неаб) сьееавс = 1псгеаепсег( сьеь1зс )т ) риыас всастс 1еьяс<т> ньеге<т>( сыв 1ЬЬзс<т> сьеьсзс, Гипс<т, ьоо1> ргебГсасе ) ( Гипс<111зс<т>, 1ььят<Т» нпегеуипс = пи11т чпегеГипс = 11вС => ( 1еьзс<т> теви1с = пен муь1вс<т>(бетаи1с(т), пи11)! 11( 1>вС.Та11 != пи11 ) ( тб( ргебьсате(11зС.Неаб) ) ( геяи1С = пеи Муьсвт<Т>( 1>вС.Неаб, нпегеГипс(11яС.Тах1) ) ) е1ве ( геви1С = нпегеуипс( 1>зС.Тат1 ); ! ) гетитп геви1г.т 548 Глава (б гессгп ннегегспс( с)тексас )! ) рпс11с всастс 111яс<п> яе1есс<т,е>( сссв 11 Гяс<т> спеьсяс, Гопс<Т,Е> зе1есгог ) ( Гппс<111яг<Т>, 111вС<р» яе1есгогрипс = пп11; яе1естогрппс = 11яС => 11тяс<к> геяп1с = пен муьсвс<п>(г(есап1с(е), пп11); 11( 1твС.Та>1 != пи11 ) ( теяп1С = пен Му11яг<П>( яе1есгог(1>як.неас(), зе1естогропс(1>вС.Тат1) ) ) гекптп тевп1С; )! текптп яе1есготрипс( тле(вяз ) Каждый из этих двух методов — И)тете и Яе1есС вЂ” использует встроенное лямбдавыражение, преобразуемое в делегат ддя выполнения работы.

На заметку1 В главе! 4 был продемонстрирован похожий прием, но поскольку лямбда-вырзжения там еще не были представлены, то использовались анонимные методы. Разумеется, лямбдавыражения существенно проясняют синтаксис. В обоих методах для выполнения простого рекурсивного вычисления и получения желаемого результата применяется встроенное лямбда-выражение. Конечный результат рекурсии формируется из результатов от каждого из этих методов. Чтобы лучше понять поток выполнения, рекомендуется воспользоваться отладчиком.

Метод Сепега11СегаСог в предыдущем примере служит для создания итератора, реализующего 1ЕппвегаЬ1е на экземплярах объекта Му).!. в С. Это практически то же самое, что было показано в примере из главы 14. И, наконец, можно собрать все вместе и выполнить показанный ниже код: риЬ11с с1аяя Яоокхавр1е ( ягагтс чотб Мати() ( чаг 1тяс1пся = пен Гвяс<тпс> ( 5, 2, 9, 4, 3, 1 чаг 1тпхгсвС = Му11ят<тпС>.СгеакевтзС( 1тяг1птя // Основные действия. чат 11пкь1вс2 = 11пкьсяс.инесе( х => х > 3 ).яе1есс( х => х * 2 )! чаг тгегакот2 = 11пхьсзс2.6епега11гегагсг( 1>яС => 1тяС.Тат1 == пп11, 11ят => 1>зС.Тат1 ); Гогеасп( чаг 1Сев тп 1Сегагог2 ) ( Сопво1е.ит1Се( "(0), ", 1Сев ); ) Сопво1е.нттке11пе() ! ОНО; язык интегрированньп запросов 549 Конечно, чтобы код скомпилировался, необходимо импортировать соответствующие пространства имен: Яузсеп.

Яузсек. 11пг1 и Яузсегл. Со11есГ1опз. Сепег1с. Запуск этого кода на выполнение даст следующий результат: 10, 18, 8 В этом примере присутствуют некоторые очень важные моменты и проблемы,на которые следует обратить внимание. Как видите, запрос не был написан с использованием выражения запроса Ыгчьг, даже несмотря на применение стандартных операций запросов ХЬеге и яе1есс. Поскольку интерфейс 111зс не реализует 1ЕпопегаЬ1е, применять Гогезсп или ггоы нельзя.

Поэтому приходится с помощью расширяющего метода Сепегз11сегасог получить интерфейс 1ЕпигкегаЬ1е на 111зс, а затем использовать его в конструкции ггоп выражения запроса ЫМЯ. В этом случае не понадобилось бы реализовывать пользовательские методы ХЬеге и яе1есс, а применить их готовые реализации из класса епопегзЬ1е. Однако тогда результаты запроса будут в форме 1ЕпиыегзЬ1е, а не 111зс, поэтому придется выполнить преобразование результатов запроса в 111зс.

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

Они чудовищно неэффективны! Одним из приемов функционального программирования, повсеместно применяемым в реализации Ыгчй, является "ленивое" вычисление. Выше в разделе "Преимущества лени" было указано, что в точке создания выражения запроса ЫтчЯ выполняется очень мало кода, а все операции происходят только по мере необходимости, когда осуществляется итерация по результатам запроса. Показанные реализации Хпеге и Яе1ест. для 111зг не следуют этой методике. Например, когда вызывается Хпеге, перед возвратом любого результата обрабатывается весь входной список целиком.

Это плохо, потому что 111зс вполне может оказаться бесконечным списком. В этом случае вызов ХЬеге никогда не вернет управления. На заметку! При разработке реализаций стандартных операций запросов или любых других методов, где желательно "ленивое" вычисление, часто используется бесконечный список для входных данных, поскольку это отличный тест правильности работы "ленивого" кода, Конечно, как показано в разделе "Ниспровержение лени", существуют определенные операции, которые просто невозможно закодировать в методике "ленивого" выполнения. Давайте построим новую реализацию пользовательских стандартных операций запроса для предыдущего примера, на этот раз применив "ленивое" вычисление. Начнем с рассмотрения операции ХЬеге.

Как ее можно по-другому реализовать для "ленивого" вычисления? Она принимает 1дйзс и возвращает новый 111зс, поэтому возникает вопрос: как сделать так, чтобы Хпеге возвращала только по одному элементу за раз? Решение состоит в реализации класса Муьзз Г. Рассмотрим типичную реализацию 1Епиглегасо г. Она содержит внутренний курсор, указывающий на элемент, который возвращает свойство 1ЕпоглегаЬ1е. Соггепс, а также имеет метод Моченехс для перехода к следующему 550 Глава [б элементу.

Метод 1Епил[егаЬ1е.моиенехс является основой извлечения каждого значения по мере необходимости. Вызов моуенехг активизирует операцию, производящую следующий результат, но только по мере необходимости, в результате чего получается "ленивое" вычисление. Фундаментальная теорема разработки программного обеспечения, сформулированная Эндрю Кенигом (Апбге» Коеп)й, "рипбагпеп(а) ТЬеогещ от Зо(ииаге Кпд[пеег[пд"), гласит, что все проблемы могут быть решены вводом дополнительного уровня посредничества .

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