Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 148
Текст из файла (страница 148)
Уозп(", ", (Яков к 1п пивЬегз огбегву к зе1еее к.тозег1пд() ) .Тодггау() ) ); Наиболее интересная часть кода выделена полужирным. В единственном операторе все элементы коллекции ппвЬегз отправляются на консоль, разделяя их запятыми и сортируя в порядке возрастания. Разве не здорово? Это работает так, что выражение запроса вычисляется немедленно, поскольку на нем вызывается расширяющий метод Тойггау, который позволяет преобразовать результаты запроса в массив.
Поэтому здесь исчезает типичная конструкция Тогеасп. Статический метод Бсг1пд.вогане следует путать с Ы(ЯЯ-конструкцией 9 сап или расширяющим методом Яо1п, который получается при использовании пространства имен яузсеп. 11пд. Этот метод берет первый параметр — строку (в данном случае содержащую запятую), посредством которой затем соединяет элементы массива строк. выстраивая одну длинную строку, где содержатся все элементы массива, разделенные запятыми. Результат, полученный от Бг гапд.
Яо1п, просто передается вызову Сопзо1е. Хг1сеЫпе. Нв заметку! Вообще говоря, ЫМО для С№ стал тем, чем является стандартная библиотека шаблонов ЗТ1 для С++. Когда ЗТС появилась впервые в начале 90-х годов, она действительно заставила программистов С++ мыслить более функционально. Это определенно было подобно глотку свежего воздуха. 1(МО создал такой же эффект для С№, и со временем наверняка появятся все более и более изощренные применения приемов функционального программирования на основе 0(НО.
Например, если программист С++ эффективно использует ЗТС, то у него редко возникает потребность в цикле Тог, поскольку ЗТЬ предоставляет алгоритмы, позволяющие передать функцию в алгоритм вместе с коллекцией, над которой нужно провести операцию, и применяющие эту функцию к каждому элементу коллекции. Эта техника удивительно эффективна. Одна из причин состоит в том, что циклы Тог — это место, где часто допускаются непреднамеренные ошибки диапазона. Разумеется, ключевое слово С№ гогеасЬ также помогает избежать этой проблемы. Ый0: язык интегрированных запросов 555 Хорошо подумав, вы, скорее всего, сможете заменить почти любой блок 1огеасп в программе выражением запроса ЫгЩ.
Возможно. так поступать не стоит, но это является замечательным уприкнением для ума в области функционального программирования. Резюме Язык ЫМЯ представляет собой кульминацию болыпинства средств, добавленных в СЗ 3.0. Или, если посмотреть под другим углом, большинство новых средств СМ 3.0 произрастают из ЫМЯ. В этой главе был показан базовый синтаксис запросов ЫМЯ, включая то, как выражения запросов Ыгхьк в конечном итоге компилируются в цепочку вызовов расширяющих методов, известных как стандартные операции запроса. Кроме того, были описаны все новые ключевые слова СЕ, предназначенные для построения выражений ЫМЯ. Хотя использовать выражения запросов ЫМЯ не обязательно, и можно отдать предпочтение непосредственному вызову расширяющих методов, они определенно повышают читабельность кода.
Также было показано, что при реализации стандартных операций запросов на типах коллекций, которые не реализуют 1Ео~лпегзЬ1е, может не быть воэможности применять выражения запросов ЬПттьг. В главе была раскрыта польза "ленивого" вычисления, или отложенного выполнения, которое интенсивно используется библиотекой, предоставляющей стандартные операции ЬПЧЯ в типах 1Епспгегао1е и 10оегуаЬ1е. И, наконец, глава была завершена объяснением того, как применять концепцию "ленивого" вычисления при определении собственных пользовательских реализаций стандартных операций запросов. ЫМьт — настолько обширная тема, что невозможно охватить все нюансы в одной главе, например, рассматривалась только разновидность ьппх1ьт то ОьЛесгз, но не затронуты ымЯ то Быть, ьпт1Я го хмь, ымЯ 1о эа1абек и ымьт го епппеэ.
Языку ьпньт посвящены отдельные книги. Вдобавок настоятельно рекомендуется почаще обращаться к документации по ЫМЯ в МБОХ. Дополнительно стоит почитать книгу Джозефа Раттца-мл. ЫМьг: язык интегрированных запросов в СФ 2008 для прокбессионалое (ИД "Вильямс", 2008 с). В следующей главе будет представлено одно из наиболее замечательных средств, добавленных в язык СФ 4.0.
Это новый тип бупаат.с, который, среди прочего, уравнял язык СЕ с МэиэЛ Вавтс в отношении возможности взаимодействия. глава 1? Динамические типы в ажность типов и их безопасности неоднократно подчеркивалась на протяжении всей книги. В конце концов, СВ является строго типизированным языков, и наивысшей эффективности можно достигнуть при использовании системы типов Св вместе с компилятором для исключения любых программных ошибок на ранней стадии, те. во время компиляции, а не на поздней — во время выполнения. Однако существуют некоторые области, где статическая, строго типизированная природа СВ создает проблемы. К ним относится возможность взаимодействия.
В этой главе рассматривается динамический (с!упаиз.с) тип, появившийся СВ 4.0, поэтому будет подробно рассказано, что он собой представляет как с точки зрения языка, так и с точки зрения исполняющей системы. Что означает динамический? По сути. с!упася1с — это статический тип, который можно использовать почти в любом месте, где мог бы примениться статический тип. Однако, он особенный, потому что позволяет сообщить компилятору, что вы не уверены точно в том, на какой тип он ссылается, и все неразрешимые решения относительно типа откладываются на время выполнения.
Экземпляру Пупаясас можно также присвоить любой ссылочный тип или тип значения. "За кулисами" компилятор вместе с исполняющей системой динамического языка (Рупапцс 1лпяпаяе Випцтпе — РЫс)' реализует всю магию по откладыванию работы до времени выполнения. Нв заметку! Четко отличайте динамические типы и неявно типизированные локальные переменные (обьявленные с помощью ключевого слова чаг). Неявно типизированные локальные переменные являются строго типизированными, даже невзирая на то, что не приходится набирать полное имя типа, к которому они относятся. Экземпляры с!упзвас на самом деле динамичны и обычно разрешаются во время выполнения, Постарайтесь избежать этой потенциальной путаницы. Чаще всего во время программирования на Са приходится иметь дело со статическими типами .НЕТ, которые могут быть закодированы также и на Са.
С++/СЫ и тп. Но что. если придется взаимодействовать с типами, которые созданы динамическими языками, такими как 1гопрутйоп или !гопйпЬу? Или же потребуется работать с объектами СОМ, реализующими 101зрассп для поддержки автоматизации через интерфейсы позднего связывания? ' Среда РЬЕ лежит в основе динамических языков на базе .НЕТ, таких как !гопрутлоп и !топнцЬу. Она предоставляет окружение, в котором легко реализовать динамические языки, а также добавлять динамические возможности статически типизированным зыкам вроде СВ. Подробные сведения о ЕНЛ ищите в документации по МАРН.
558 Глава! 7 Рассмотрим для начала взаимодействие СОМ/101врасЬ. Вдобавок предположим, что речь идет о реализациях 101 вра С сЬ позднего связывания, а не реализациях вуального интерфейса. В С№ 3.0 приходилось полагаться на огромные объемы рефлексии для динамического вызова методов и свойств экземпляра, что было крайне запутано и неестественно. При этом "за кулисами" происходило следующее: объект Еип1йпе СайаЫе Аугаррег (ВС%). выполняющий функции иронси между исполняющей системой .МЕР и объектом СОМ, тРанслиРовал опеРации рефлексии в операции 101врассь. Это позволяет осуществлнть рефлексию через объект сОм, реализующий интерфейс автоматизации 101врассь. При использовании ЧВ.МЕТ вместо С№ 3.0 впечатление было намного приятнее, поскольку ЪВ.)ь(ЕТ ограждает от всей работы, связанной с рефлексией.
С появлением в С№ 4.0 поддержки типа п(упавсс и среды ОЬК, функциональность С№ в отношении рабаты с динамически типизованными объектами сравнялась с ЧВ.ХЕТ. Чтобы лучше проиллюстрировать сказанное, рассмотрим небольшой пример. Предположим. что требуется создать новый документ Ехсе1 с некоторым текстом в его первой ячейке. Вдобавок, в целях эксперимента воспользуемся только интерфейсами 101зрагсЬ позднего связывания. Если вы знакомы с кодированием для приложений ОГйсе, таких как Ехсе1, забудьте на минуту о существовании сборок рт(пьаху !и!егор АззешЬйев (Р1А).
Пример кода на С№ 3.0 может выглядеть следующим образом; изьлд Яувгев; нвьлд Яувгев.нег1есгьол) вгагьс с1авв ЕлггуРоьлг ( вгагьс чоьб Маьл() ( /7 Создать экземпляр Ехсе1 Туре х1АррТуре = Туре.аегтурерговРгоо10( "Ехсе1.Арр11сагьол" ) оЬ)есг х1 = АсС1чвгог.Сгеаге1лвгапсе( х1АррТуре ); 7/ Сделать Ехсе1 видимым х1.0егтуре О .1лчо)ьеМевЬег( "Ч1в1Ь1е", В1лб1лаР1аав.зеСРгореггу, лч11, х1, лен оЬЯесг() ( сгсе ) ); /l Создать новую рабочую книгу оъ)есс ногхъоохв = х1.6естуре О .1лчо)семевъег( твогкьоохв", Вслб1пду1вдв.аегргореггу, лч11, х1, пч11 )7 ног)гЬоогв.аегтуре().1лчо)ьеневЬег( "Абб", В1лб1лЧР1адв.1лногенеСЬоб, пи11, ногкЬоохв лен оЬ)есг[) ( -4167 ) // Установить значение первой ячейки оЬЯесг се11 = х1.0еСТуре().1лчогемевЬег( "Се11в", Вглб1паР1адз.аеСРгореггу, лс11, х1, пен оЬЯесг(1 ( 1, 1 ) се11.6егтуре О .1лчогеневЬег( "Ча1се2", В1лб1лдР1эдв.зеСРгореггу, ла11, се11, лен оЬ)ест() ( "С№ Носка!" ) Сопво1е.нгьгеььле( "Нажмите Елгег для продолжения..." )~ Солзо1е.невбв1ле О 7 ) Динамические типы 559 Трудно не согласиться с тем, что стиль кодирования является неуклюжим н аапутанным.
С первого взгляда на код непросто определить, какие методы н свойства объектов Ехсе1 на самом деле вызываются. После создания новый экземпляр приложения делается видимым, затем за счет обращения к свойству Нот)сЬоо)ся создается новая рабочая книга и, наконец, в первую ячейку помещаются некоторые данные. Теперь рассмотрим новый усовершенствованный способ выполнения той же задачи в С№ 4.0 с применением типа булавке; оя1по Яуятев; ятатта а1аяя ЕпттуРотпт ( ятатта чотб Ма1п() // Создать экземпляр Ехае1 Туре х1Арртуре = туре.яеттурерговртоо10( "ехсе1.Арр11саг1оп" ); булавка х1 = Асттчатот.Стеасе1пятапсе( х1АррТуре УУ Сделать Ехсе1 аиднммм х1.У1я1Ь1е = огне; /7 Создать новую рабочую книгу бупав1а нот)спооия = х1.иот)споо)ся1 ног)спооия.пбб( -4167 ): уу установить значение новой ячейки х1.Се11я(1, 1].()а1пе2 = "С№ копия! Ч Сопяо1е.игттеььпе( "Нажмите Ептег для продолжения..." )> сопяо1е.неабьтпе О 7 ) ) Такой код понять намного проще.











