
Лекция 1
1. Введение
1.1. Роль C# и .NET
Язык С# и связанная с ним платформа .NET (.NET Framework) относятся к наиболее важным новым технологиям для разработчиков ПО за последние годы. Концепция .NET предложила новую среду, в которой можно разрабатывать почти любое приложение для Windows. В свою очередь, С# – новый язык программирования, созданный специально для работы с платформой .NET. С помощью С# можно создать традиционное оконное приложение Windows, динамическую web-страницу, компонент распределенного приложения, компонент доступа к базе данных и т. д., на основе единой среды разработки.
За последние 15-20 лет операционные системы Windows прошли путь от Windows 3.1 (выпущенной в 1992 г.; это еще не операционная система, а оболочка на DOS) до Windows 7. Несмотря на существенные отличия более поздних систем от Windows 3.1 (Windows 2000 уже имела новое ядро), процесс классического программирования для всех этих систем чрезвычайно схож. Все они имеют в своей основе хорошо известный Windows API, к которому по мере появления новых версий добавлялось большое количество новых функций, т.е. в целом это был процесс расширения и развития, а не замены API.
То же можно сказать и о других технологиях, которые сегодня еще используются для разработки Windows-приложений. Так, была технология OLE, дающая метод связи различных приложений. На ее основе была создана СОМ, затем DCOM (распределенная СОМ) и, наконец, СОМ+ – сложная технология, обеспечивающая взаимодействие практически всех компонентов в Windows.
Эти и многие другие примеры показывают эволюционное развитие – расширение существующих технологий. Одной из главных была цель обеспечения обратной совместимости с уже имеющимися продуктами. Обратная совместимость, являясь одной из наиболее сильных сторон семейства Windows, в то же время обладает и огромным недостатком. Каждый раз, когда какая-нибудь технология расширяется, она становится более сложной. В результате появилось много областей программирования, написание кода для которых существенно усложнено обратной совместимостью с технологиями 15-летней давности.
Это не могло продолжаться слишком долго. Наступил момент, когда возникла необходимость начать с нуля. Такой отправной точкой можно считать С# и .NET, которые позволяют разработчику легко создавать современные программные продукты широчайшего спектра, не оглядываясь на устаревшие технологии. Если говорить упрощенно, то .NET представляет собой новую платформу, новый API для программирования в Windows. С# – новый язык для работы с этой платформой, позволяющий использовать все достижения прогресса сред разработки и принципов объектно-ориентированного программирования в течение последних 20 лет.
При этом не потеряна и обратная совместимость. Существовавшие ранее программы также будут выполняться, а платформа .NET умеет работать с имеющимся программным обеспечением.
Следует отметить, что в определенной мере прообразом C# + .NET послужила система Delphi, сделавшая большой шаг в сторону облегчения программирования Windows-приложений без существенных ограничений возможностей разработчика. Недаром одним из основных идеологов C# является А. Хейлсберг, ранее игравший главную роль в создании Delphi 1–2.
Чтобы писать программы для платформы .NET, необязательно изучать С#. Microsoft модифицировала для .NET язык C++ и произвела значительные изменения в VB, который превратился в более мощный язык VB.NET. Множество языков для .NET предлагается также сторонними разработчиками. В частности, Delphi 8 была целиком ориентирована на платформу .NET. Особенность C# в том, что это – новый язык, созданный специально и исключительно для .NET Framework.
Платформа .NET аналогично Windows представляет собой одновременно два качества. Во-первых, это библиотека, не меньшая, чем Windows API. Ее можно использовать для вызова тех функций, которые традиционно выполнялись операционной системой Windows: отображение окон, проверка удостоверений безопасности, вызов основных служб операционной системы, создание потоков и т. д. Кроме того, предлагается много новых возможностей: доступ к базам данных, соединение с Интернетом, предоставление служб Web и т. д. В отличие от предыдущего Windows API, который содержит огромный набор функций языка C, библиотека .NET (называемая также библиотекой базовых классов .NET) является полностью объектно-ориентированной. Она выглядит как набор классов, каждый из которых реализует определенный набор методов.
Во-вторых, платформа .NET – это среда, в которой выполняется программа (называется общей средой исполнения – CLR). Она содержит программное обеспечение для выполнения пользовательских программ. Когда исполняется .NET-код (обычно применяется термин управляемый код – managed code), платформа .NET запускает программы, управляет потоками, предоставляет различные вспомогательные службы и фактически является той средой, которую «видит» вокруг себя исполняемая программа. Выполняемые в .NET программы представлены промежуточным кодом на языке MSIL (Microsoft Intermediate Language), являющемся языком ассемблера некоторой виртуальной машины. Программы на MSIL переводятся в машинный язык реального процессора лишь непосредственно перед выполнением c помощью так называемой компиляции времени выполнения (Just-In-Time compilation). Указанная виртуальная
машина является объектно-ориентированной: структура MSIL отражает разбиение кода на классы, методы и т. п.
Таким образом, можно рассматривать .NET как среду, обеспечивающую некоторый уровень абстракции от операционной системы. Если это необходимо (например, для увеличения производительности), то в ряде случаев можно отказаться от преимуществ .NET и напрямую использовать Windows API. Это можно делать с помощью С# или управляемого кода, созданного на других .NET-языках.
Резюме
Платформа .NET и связанный с ней язык C# позволяют разрабатывать приложения Windows различных типов в единой среде разработки.
Принципиально новым является отказ от обратной совместимости как основной цели, что позволяет использовать новейшие технологии и существенно не усложнять средства разработки.
Наряду с C# существует множество других языков разработки для .NET; C# является новым языком, созданным специально для .NET.
Роль API в .NET играет объектно-ориентированная библиотека базовых классов, являющаяся основой для всех языков программирования .NET.
.NET является также исполняющей средой для программ, предварительно переведенных в код MSIL.
1.2. Преимущества .Net
Кратко рассмотрим основные преимущества платформы .NET.
Объектно-ориентированное программирование.
Старый Windows API был написан на C и является целиком процедурным. Напротив, .NET и С# полностью основаны на принципах ООП. Идеология ООП реализована на уровне исполняющей среды.
Хороший дизайн.
Это свойство субъективно, однако Microsoft в течение долгого времени обсуждала с разработчиками структуру классов .NET и извлекла уроки из накопленных за десятилетие ошибок прошлого. В результате библиотека базовых классов .NET разработана с нуля и сделана интуитивно ясной. В большинстве случаев достаточно взглянуть на объявление метода, чтобы понять, что он делает и как его использовать. Этого нельзя сказать о Windows API, функции которого не всегда понятны. Они часто требуют передачи параметров, необходимых не для выполнения цели данной функции, а для внутренней работы API или обеспечения обратной совместимости.
Языковая независимость.
С применением платформы .NET все языки, включая VB.NET, С# и управляемый C++, компилируются в общий промежуточный язык MSIL. Это означает, что языки совместимы на новом уровне. Например, в отладчике можно перешагивать с кода C++ на код С# или код VB.NET без каких-либо проблем. Более того, эти языки используют теперь общую среду разработки.
Языковая независимость достигнута добавлением в каждый язык свойств, хорошо зарекомендовавших себя в других языках. VB.NET теперь содержит классы и наследование подобно C++. Если для программирования используется C++, то среда разработки поддерживает элементы управления drag-and-drop точно так же, как это было реализовано в VB.
Однако некоторые важные особенности языка C++ (множественное наследование, шаблоны) не поддерживаются в языках .NET и соответственно не могут использоваться в управляемом коде. В C# со второй версии появились generics – аналоги шаблонов.
Улучшенная поддержка динамических web-страниц.
До появления .NET стандартным способом размещения динамических страниц на Windows-серверах являлось использование технологии ASP. Это гибкое средство, но оно неэффективно из-за применения интерпретирующихся языков сценариев, а отсутствие объектно-ориентированной разработки часто приводит к созданию нечитаемого кода. Платформа .NET предлагает встроенную поддержку web-страниц с использованием новой технологии – ASP.NET. При помощи ASP.NET код в web-страницах компилируется и может быть написан на любом языке высокого уровня, предназначенном для .NET, например, на С# или VB.NET. Это повышает эффективность обработки запросов, поступающих от браузеров. Языки сценариев для работы на стороне сервера теперь считаются устаревшими (хотя их применение допускается). В то же время клиентский JScript для браузеров используется по-прежнему. Большое число других возможностей ASP.NET позволяет создавать страницы с более четким разделением пользовательского интерфейса и фоновой обработки данных. Таким образом, разработчик может сконцентрировать усилия на бизнес-логике web-страниц, остальное сделает ASP.NET.
Доступ к данным.
Доступ к данным, который был добавлен в Windows позже, является теперь одной из основных составляющих библиотеки базовых классов. Набор компонентов .NET, известный как ADO.NET, обеспечивает эффективный доступ к реляционным базам данных и большому числу источников данных. Имеются также компоненты для доступа к файловой системе и каталогам. В .NET встроена поддержка XML, что позволяет работать с данными, портированными с/на нe-Windows платформы.
Отказ oт применения DLL.
В свое время концепция DLL (dynamic linked libraries) стала большим достижением в плане экономии дискового пространства и памяти, а также позволила различным процессам совместно использовать один и тот же код. Однако по мере работы с DLL выяснилось, что их применение приводит к проблемам из-за отсутствия системы контроля над версиями. Более новая версия DLL, как правило, затирает собой предыдущую. Часто новая версия оказывается не полностью совместимой с предыдущей, в результате чего некоторые программы, использующие старую DLL, больше не работают на данной машине. Такие ошибки трудно отыскать. Платформа .NET полностью изменила способ, с помощью которого некоторый код совместно используется приложениями. Введена концепция сборки (assembly), заменившая традиционную DLL. Сборки имеют встроенные средства контроля версий, а разные версии сборок могут сосуществовать одновременно.
Улучшенная безопасность.
От того, как сформированы сборки, зависит безопасность системы. Каждая сборка в .NET может содержать встроенную информацию о безопасности. Она четко указывает, какой пользователь, группа пользователей или процесс может вызывать определенные методы того или иного класса. Это позволяет управлять использованием создаваемых сборок.
Простая установка приложений.
Начиная с Windows 95, СОМ-объекты должны были регистрироваться в реестре. Эта практика позволяет централизованно хранить информацию об установленных в системе программах. Однако, в результате использования системой СОМ-объектов библиотек типов, появляются дополнительные проблемы, так как информация об одном объекте хранится в нескольких местах. Например, код некоторого компонента может находиться в файле ЕХЕ или DLL; описания методов и интерфейсов могут храниться где-то еще в библиотеке типов; a GUID и т. п. будут описаны в реестре.
Разброс информации может привести к ее рассинхронизации. Многим разработчикам СОМ-объектов приходилось заниматься поиском и исправлением несоответствий, возникающих в реестре. С платформой .NET это перестает быть проблемой, так как сборки полностью описывают себя в этом плане без использования реестра.
Можно также различать общие сборки, доступные для других приложений, и частные сборки, которые могут использоваться только установившим их приложением. Это решает еще одну проблему СОМ – проблему того, что реестр постепенно забивается информацией о тысячах компонентов, не предназначенных для совместного использования.
Поддержка Web-сервисов.
Web-сервисы, по признанию многих высококвалифицированных специалистов, будут приобретать все возрастающее значение в течение последующих лет. Идея состоит в том, что различные методы объекта могут быть вызваны по Интернету при помощи стандартных web-протоколов. Это придает новый смысл технологии распределенных приложений. Различные компании путем разработки указанных Web-методов смогут предоставлять различные услуги: прогнозы погоды, состояния счетов, проверки кредитных карт и т. д., а клиенты смогут вызывать эти методы по Интернету с помощью собственного программного обеспечения. До появления .NET Microsoft уже обеспечивала ограниченную поддержку web-сервисов посредством инструментария SOAP (Simple Object Access Protocol). Платформа .NET имеет встроенную поддержку разработки web-сервисов, и создавать их теперь так же легко, как и любые другие типы приложений.
C#
Одним из важнейших преимуществ .NET является наличие самого языка C#. Это новый хорошо продуманный язык, совместимый с новыми технологиями и не отягощенный проблемами обратной совместимости. В нем устранен ряд недостатков, имеющихся в существующих языках программирования. Чтобы понять его преимущества, нужно изучить язык C#. Здесь пока лишь кратко перечислим его особенности.
Полная поддержка объектно-ориентированного программирования, включая наследование интерфейсов и реализаций, виртуальных функций, перегрузки операторов.
Хорошо определенный набор основных типов; все типы ведут себя как объекты.
Встроенная поддержка автоматической генерации XML-документации.
Автоматическое освобождение динамически распределенной памяти.
Возможность отметки классов и методов атрибутами, определяемыми пользователем; эти атрибуты могут быть прочитаны во время выполнения.
Полный доступ к библиотеке базовых классов .NET, а также легкий доступ к Windows API, когда это необходимо.
Язык разработан таким образом, что практически всегда можно обойтись без указателей и прямого доступа к памяти. Однако при необходимости они могут быть использованы.
Поддержка свойств и событий в стиле VB или Delphi.
Возможность использования С# для разработки динамических web-страниц ASP.NET.
Простота в изучении.
Отметим также некоторые ограничения С# и .NET. Эта платформа не предназначена для разработки наиболее критичных по времени и высокопроизводительных программ, т. к. целевым при компиляции C# (и других .NET – языков) является промежуточный MSIL, а не машинный язык. Неуправляемый C++ остается в этой области более предпочтительным. В С# отсутствуют некоторые ключевые моменты, необходимые для создания высокопроизводительных приложений, в частности, подставляемые функции и деструкторы, выполнение которых гарантируется в определенных точках кода. Однако число приложений, попадающих в эту категорию, невелико.
В то же время Microsoft утверждает, что JIT-компиляция имеет свои преимущества в плане повышения производительности. Поскольку компиляция происходит непосредственно перед выполнением, то при генерации кода могут быть учтены оптимизирующие особенности конкретного процессора.