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

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

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

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

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

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

После этого он возвращает результат вызова анонимного метода коду, обратившемуся к Нечегяе<Т>. Вся работа по построению обратного списка инкапсулирована в замыкании, созданном анонимным методом,и в захваченныхлокальных переменных гечегяеь1яг и гечегяеуипс. Делегат, захватывающий переменные, часто называют замыканием (с1озиге), которое представляет собой конструкцию, где функция упаковывается вместе с окружением (таким как переменные). Расширяющие методы 497 Функция гечегзегспс просто вызывает себя рекурсивно, пока не завершит построение обратного списка в захваченной переменной гетегзеьгзг. Те.

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

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

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

А что случиться, если 1ЕпптегаЬ1е<Т> будет бесконечным итератором вроде того, что создавался Сгеаге1пгзпугеьазг в разделе Цепочки операций"? если бы муъ1зг<т>. сгеаге11зг наполнялся результатом сгеасе1пуъп1геъ1зг, то пришлось бы принудительно прерывать программу или ждать, не произойдет ли переполнение памяти при попытке построения муъгзг<т>. В случае создания библиотеки общего пользования, содержащей тип муъъзг<т>, который строит себя на основании заданного типа 1ЕгплпегаЬ1е<Т>, должны быть предусмотрены все возможные сценарии. с которыми придется столкнуться. Переданный объект 1ЕпишегаЬ1е<т> может потребовать очень много времени на вычисление каждого элемента перечисления.

Например, он может это делать на основе актуальной информации из базы данных, доступ к которой обходится очень дорого. За примером создания списка в "ленивой" манере, в котором каждый узел создается по мере необходимости, загляните в блестящий блог Веса Дайера (й(ез Вуег), озаглавленный "%)ту ай (Ье )оте Гог Бзтэ?" (" Почему все 498 Глава ) 4 любят списки?") ~. Техника "ленивого" вычисления при итерации — фундаментальное средство Ы)Ч)И, о чем будет рассказано в главе 16.

Шаблон Ч~вйог Шаблон Ч)зйог (Визитер), как он описан в фундаментальной книге "банды четырех" ', позволяет определять новую операцию над группой классов, не изменяя самих классов. Удобным средством реализации шаблона Ч)з)гог являются расширяющие методы. Например, рассмотрим коллекцию типов, которые могут быть или не быть связанными отношением наследования, и предположим, что требуется добавить функциональность для проверки их экземпляров в некоторой точке приложения. Один вариант, хотя и очень непривлекательный, заключается в модификации общедоступного контракта всех типов введением нового метода ча11с1асе в каждый из ннх.

Кто-то может даже прийти к заключению, что простейший путь — это ввести новый базовый тнп, унаследованный от Бузсет. Оь) ест н реализующий ча11басе как абстрактный метод, и в дальнейшем наследовать все типы от него вместо яуэсеп. ОЬ) ест. И то, и другое не приведет ни к чему иному, кроме как к сплошному кошмару при сопровождении. Расширяющий метод нли коллекция расширяющих методов лучше справятся с задачей. Имея коллекцию не связанных между собой типов, скорее всего, будет реализована целая группа расширяющих методов.

Красота состоит в том. что изменять ранее определенные типы не понадобится. К тому же, если типы изначально разработаны кем-то другим, изменить их не получится. Рассмотрим следующий код: иэгпЧ Буэиеаг из1пЧ Ча11багогЕхиепзтопэ; памезрасе Ча11баиогЕхиепэ1опз ( риЬ11с зиатьс с1азз Ча11батогз риь11с эсзт1с чоьб Ча1ьбзие( Сбьэ Яигьпд зтг ) ( г'г' Что-то делать Лля проверки экземпляра Ятг1пЧ. Сопэо1е.кг1те11пе( "Экземпляр Ятгьпч с 1"" зтг проверен." риь11с зиаи1с чоьб Ча1ьбаие( тбьз Бирр1уСаЬЕпеи сзЬ ) ( !/ Что-то делать Лля проверки экземпляра Яирр1уСаЬ1пет.

Сопзо1е .Иг1ие) ьпе ( "Экземпляр Яирр1уСаЬтпеи проверен." ); ) риЬ11с зеатьс чо1г) Ча116ате( тбьз Етр1оуее етр ) ( // Что-то делать лпя проверки экземпляра Еар1оуее. Сопзо1е.кгтте11пе( "** Сбой прм проверке экземпляра Етр1оуее! **" ) ) риЬ11с с1азз Яирр1усаЬ1пет Этот блогнаходится по адресу Ь1оЧэ.ваап.сов?незбуегй Эрих Гамма(Ег)сЬ Оалппа), Ричард Хелм (К)спап) НеЬп), Ральф Джонсон (йа(рЬ,ЗоЬпэоп)н джон Влиссидес (доЬп УМзэ)беэ) Г)ез)дп рпкепм: е)ягпепгз оу)Чеиэаые О))(есг-Ог!епгес) Бо)Ьиагв (АсЫ)зоп-ьуеэ)еу рго(езэ1опа1, 1995 г.).

расширяющие методы 499 роЫЬс с1азя Еяр1оуее ( ) риЫ1с с1аяя Муярр11сзсаоп ( ягагтс чо1б Маял() ( Бгггпд бага = "некоторые важные данные О Япрр1уСаЪхпес яорр11ея = пен Яорр1уСаЬЬпеС(); Емр1оуее ЬгЬябу = пен Епр1оуее()) бвтв.уя11баСе()> яорр11ея.ча11бяге О; ЬгЬабу.Ча11баге(); Обратите внимание,что для каждого типа объекта, который мы хотим проверить (в данном примере их три), я определил отдельный расширяющий метод ча1).басе. Вывод этого приложения показывает, что для каждого экземпляра вызывается правильный метод Ча11баге: Экземпляр Бггтпс С "НЕкстОрЫЕ ВажНЫЕ ДаННЫЕ" ПрОВЕрЕН. Экземпляр Борр1уСаЬЬпег проверен.

** Сбой при проверке экземпляра Епр1оуее! ** В данном примере важно отметить, что визитеры — в данном случае расширяющие методы по имени ча11с(асе — должны трактовать экземпляры, которые они проверяют, как черные ящики. Имеется в виду, что сами они не обладают такими способностями проверки, как настоящие методы экземпляра, поскольку только настоящие методы экземпляра имеют доступ к внутреннему состоянию объекта. Тем не менее, в приведенном примере имеет смысл проверять экземпляры с точки зрения клиента. На заметку) Имейте в виду, что расширяющие методы, определенные в той же сборке, что и типы, которые они расширяют, могут иметь доступ к членам Ьпгегпа1.

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

Характеристики

Тип файла
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
Средний доход
с одного платного файла
Обучение Подробнее