Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 5
Текст из файла (страница 5)
Этот стандарт быстро завоевывает признание и уже реализован вне платформы М!ставай йг!пдоив. На заметку! Рекомендуется посмотреть, как дела у команды Мапо', которая занимается реализацией альтернативной исполняющей системы для других платформ с открытым кодом — Нгдиа! Ехесибоп Зуз!ешз (НЕЗ). В стандарт СЫ входит также файловый формат РЕ (РогтаЫе ЕхеситаЫе — переносимый исполняемый модуль) для управляемых модулей. Таким образом, в действительности можно скомпилировать программу Са на платформе УУ!пдоигз, а выполнять и на ЪН!пдоигэ, и на Ыпих, причем без перекомпиляции, поскольку даже формат файлов является стандартизованным~.
Степень переносимости чрезвычайно удобна и всегда занимала умы и сердца проектировщиков СОМ/ОСОМ в прежние дни, но по разным причинам не была достигнута в нужной мере между разными платформами". Одна из главных причин неудачи состоит в том, что технологии СОМ не хватает выразительного и расширяемого механизма описания типов и их зависимостей. Спецификация СЫ изящно решает эту проблему, вводя метаданные, которые рассматриваются в главе 2. ' Документ по стандарту СЫ вЂ” Есша 336 — доступен по адресу низ. е сиз-! пг е гпасзопа1. о гд. Там же можно найти и Есша-334 — документ по стандарту языка СВ. Информацию о проекте Мапо можно найти на сайте ннн.
яопо-рго) ест . сож Разумеется, на целевой платформе также должны быть установлены все зависимые библиотеки. Зто быстро становится реальностью за счет распространения библиотеки .НЕТ Зтапдагд ЫЬгагу Например, загляните на нни. Оо-иапо. сот/досз/, чтобы увидеть. насколько велико покрытие библиотек в проекте Мапо. Если вас интересуют подробности, рекомендуется прочесть книту Дона Бокса (Ооп Вох) и Криса Селлса (С)тнз Зебз) Еззепигй.!НЕТ Уо!игле й 77зе Сояипоп Ьолдиоде йигиапе(Воз!оп, МА: Адд!эоп-тхгез(еу Рго!езэ!опа!.
2002 г.). (Заголовок дает основания ожидать, что рано илн поздно появится и том 2. Будем надеяться. что книга не повторит судьбу фильма Мела Брукса "Всемирная история: часть первая".) Обзор С№ 23 Сборка мусора С~В Одним из ключевых средств С).В является сборщик мусора (ОагЬаяе СоБестог — ОС). ОС избавляет от забот об управлении выделением и освобождением памяти, которое является причиной многих ошибок в программном обеспечении.
Однако ОС не избавляет от управления ресурсами, в чем вы убедитесь в главе 4. Например, дескриптор файла— это ресурс, который должен быть каким-то образом освобожден. ОС имеет дело напрямую лишь с ресурсами памяти. Для обработки ресурсов, не связанных с памятью, таких как подключения к базе данных и дескрипторы файлов, можно использовать финализаторы (рассматриваемые в главе 13), которые позволяют освобождать ресурсы тогда, когда ОС известит об уничтожении объекта. Однако еще лучше для этой задачи применять шаблон О)эрозаЫе (Освобождаемый), который будет продемонстрирован в главах 4 и 13. Ма заметку! Среда СЫ ссылается на все обьекты ссылочных типов опосредовано, подобно тому, как вы работаете с указателями и ссылками в С++, но без применения синтаксиса указателей.
Когда вы объявляете переменную ссылочного типа в С№, то тем самым в действительности резервируете место лод хранение для ассоциированного с ней типа, либо в куче, либо в стеке, и эта переменная хранит ссылку на объект. Поэтому когда вы копируете ссылку на объект из одной переменной в другую, то в результате получаете две переменных, ссылающихся на один и тот же обьект. Все экземпляры ссылочных типов располагаются в управляемой куче. СЕВ управляет местоположением этих объектов, и когда возникает необходимость переместить их в памяти, она обновляет все ссьюки на перемещаемые объекты, чтобы они указывали на новое местоположение.
Кроме того, в СЕВ существуют типы значений, и их экземпляры находятся в стеке или существуют в виде полей объектов, располагающихся в куче. Их применение связано со многими ограничениями и нюансами. Обычно они используются, когда необходима облегченная структура для управления некоторыми связанными данными. Типы значений также удобны для моделирования неизменяемых фрагментов данных. Эта тема более подробно раскрывается в главе 4.
С№ позволяет быстро разрабатывать приложения, имея дело с меньшим количеством рутинных деталей, чем это возможно в среде С++. В то же время С№ представляет собой язык, который выглядит знакомым для разработчиков на С++ и дача. Пример программы на С$ Давайте внимательно рассмотрим очень простую программу на С№. Обратимся к традиционному примеру "Не!!о 1)))ог!6)", который все знают и любят. Ее консольная версия на С№ выглядит так, как показано ниже. с1аэз ЕпсгуРотпг ) згагтс чсьа Матп)) ) Яузгек.зопзо1е.игтгеьзпе( "Не11о Хог1г))" ); ) ) Обратите внимание на структуру этой программы на С№. В ней объявляется тип )класс по имени ЕпггуРо№пг) и член этого типа )метод по имени Маап), Это отличает ее от С++, где тип объявляется в заголовке, а определяется в отдельной компилируемой единице — обычно в файле .
срр. К тому же метаданные (описывающие все типы в модуле и прозрачно генерируемые компилятором С№) избавляют от необходимости опережающего объявления и включения заголовков, как того требует С++. Фактически опережающее объявление в С№ вообще отсутствует. Программисты на С++ найдут статический метод Маап знакомым, за исключением того факта, что его имя начинается с заглавной буквы. Каждая программа нуждается в точке входа. и в случае С№ такой точкой служит статический метод Мазп.
Есть и другие отличия. 24 раааа ! Например, метод Мауп объявлен внутри класса (в данном случае — япсгууоупг). В СВ вы обязаны объявлять все методы внутри определения типа. Здесь не существует статических свободных функций, как в С++. Типом возврата метода ма).п может быть либо ).пт., либо соус), в зависимости от существующих потребностей.
В приведенном выше примере метод Ма).п не имеет параметров, но если нужен доступ к параметрам командной строки, то в методе Мэ).п можно объявить параметр (массив строк) для обращения к иим. На заметку! Если приложение содержит несколько типов со статическим методом маус, с помощью ключа /паул компилятора выбирается тот, который должен быть запущен, Может показаться, что вызов игусеьупе выглядит многословным. Я должен был квалифицировать имя метода именем класса Сопэо1е, а также указать имя пространства имен, в котором находится класс сопзо1е (в данном случае — Яузгеп)/ .мет (и, следовательно, СВ) поддерживает пространства имен во избежание конфликтов имен в огромном глобальном пространстве.
Однако вместо того, чтобы всегда требовать указания полностью квалифицированного имени, включая пространство имен, СВ предлагает директиву пз1пд, которая является аналогом ппрогс в языке Зама и пз1пд пая)е арапе — в С++. Поэтому можно слегка изменить предыдущий пример программы, переписав его так, как показано в листинге 1.1. Листинг !.!. Ьв11о иог1сЬ ов иэгпд Яузсеа) с1азэ Епсгугогпс ( зсат1с того Ма1п() Сопэо1е.нг1кептпе( "Не11о Иог1П)" )) ) При наличии директивы из1пд яузгеп) в вызове сопзо1е.иг1сеь1пе имя пространства Я уз сея можно опустить. Чтобы скомпилировать этот пример, введите в командной строке %)пбоиъ следующую команду: сзс.ехв /ггазсог11Ь.о11 /Гагдес:ехе Ье11о иог1п'.сз Давайте разберемся, из чего состоит и что делает эта команда.
° сэс. ехе — это компилятор М(сговой С». ° Опция /г указывает зависимости сборок данной программы. Сборки подобны концепции РЬЬ-библиотек в мире "родного" кода. пзсог11Ь. ((11 — это место, где определен объект Яузгея).сопзо1е. В действительности ссылаться на сборку тзсог11Ь не нужно, поскольку компилятор сошлется на нее автоматически, если только не указать опцию /позг с(11Ь.
° Опция /сагдег: ехе сообщает компилятору, что строится консольное приложение; данная опция принимается по умолчанию, поэтому указывать ее не обязательно. Другие варианты, которые можно здесь задать: /сагдес ) и1пехе — для построения %(пботга-приложения с графическим интерфейсом пользователя; /Гагдес) 11Ьгагу — для генерации сборки РЬЬ с расширением . ((11) /Гагяег ) л)о)(п1е — для получения сборки РЬЬ с расширением .
пепл)от(п1е. Последняя опция генерирует модули, не содержащие манифеста сборки, так что его понадобится включить в сборку позднее с помощью компоновщика сборок а1. ехе, Такой подход позволяет создавать многофайловые сборки. ° Ье11о иог1с) . сэ — компилируемая программа СВ. Если в проекте присутствует множество файлов СВ. их можно просто перечислить в конце командной строки. Обзор С№ 25 После выполнения приведенной выше команды будет получен файл Ье11о ног1с).
ехе, который можно запустить из командной строки и увидеть ожидаемый результат. Если хотите, можете пересобрать код с опцией /с)еЬио. Тогда можно будет осуществлять пошаговое выполнение внутри отладчика. Чтобы продемонстрировать независимость от платформы С№. при наличии работающей ОС Впрах с установленным пакетом Моно ЧЕ8, можно скопировать модуль Ье11о ног1с1. ехе непосредственно в его двоичном виде и запустить, получив тот же самый результат, если в Ыпих все настроено правильно.
Обзор средств, добавленных в СФ 2.0 Со времен начального выпуска в конце 2000 г. язык С№ заметно эволюционировал. Эта эволюция стала возможной благодаря его широкому распространению. С появлением версии Ч!зла) 8!цб!о 2005 и .)ЧЕТ Ргагпечог)с 2.0 компилятор С№ стал поддерживать расширения языка С№ 2.0. Это стало отличной новостью, поскольку в С№ 2.0 были включены некоторые удобные средства, обеспечивающие более естественный стиль программирования с большей эффективностью.
В настоящем разделе приводится обзор этих новых средств, а также даются ссылки на последующие главы, в которых содержится более детальная информация. Возможно, наиболее важным дополнением С№ 2.0 стала поддержка обобщений. Их синтаксис подобен шаблонам С++. но основное отличие состоит в том. что конструируемые типы, созданные на основе обобщений .)ЧЕТ, являются динамичными по своей природе, т.е. они привязываются и конструируются во время выполнения. Это отличает их от конкретных типов С++, создаваемых из шаблонов, которые являются статичными— в том смысле, что связываются и создаются во время компиляции'. Обобщения наиболее удобны, когда они применяются с контейнерными типами вроде векторов, списков и хеш-таблиц, где они обеспечивают великолепную эффективность.
Обобщения могут трактовать типы, которые они содержат, как специфические типы, а не как базовый тип всех объектов — Бузсен. ОЬ) есг. Тема обобщений будет раскрыта в главе 11, а о коллекциях речь пойдет в главе 9. В С№ 2.0 была добавлена поддержка анонимных методов. Анонимный метод — это то, что иногда называют лямбда-функ!)иеб; данная концепция пришла в С№ из функционального программирования. Анонимные методы С№ исключительно полезны для работы с делегатами и событиями.












