double arrow

Предыдущее состояние дел


Технология .Net

Оглавление

Технология.Net
  1.1 Предыдущее состояние дел
  1.2 Решение технологии .NET
  1.3 Главные компоненты платформы .NET
  1.4 Общеязыковая среда выполнения
  1.5 Общая система типов и общеязыковые спецификации
  1.6 Библиотека базовых классов
  1.7 Роль языка С#
  1.8 Компоновочные блоки
  1.9 Роль метаданных типов .NET
  1.10 Роль манифеста компоновочного блока
  1.11 Общая система типов
Объектно-ориентированное программирование
  2.1 Главные элементы объектно-ориентированного подхода
  2.2 Дополнительные элементы ООП
  2.3 Принципы объектно-ориентированного программирования
Классы
  3.1 Объект (экземпляр класса)
    3.1.1 Ключевое слово "this"
    3.1.2 Отношения между объектами
    3.1.3 Основные отличительные особенности класса
  3.2 Инкапсуляция в классе
    3.2.1 Спецификаторы доступа к классам
    3.2.2 Состав класса
  3.3 Поля класса
    3.3.1 Доступ к полям
    3.3.2 Статические и экземплярные переменные
  3.4 Методы (функции-члены класса)
    3.4.1 Переменное число параметров метода
    3.4.2 Статические методы
    3.4.3 Конструкторы
    3.4.4 Закрытые конструкторы или классы без экземпляров
    3.4.5 Статические конструкторы
    3.4.6 Деструкторы
    3.4.7 Абстрактные методы и классы
  3.5 Свойства
  3.6 Индексаторы
  3.7 Статические классы
  3.8 Частичные классы
  3.9 Рекомендации по программированию
Наследование
  4.1 Типы наследования
  4.2 Наследование реализации
    4.3.1 Определение наследующих классов
    4.3.2 Уровень доступа protected и internal
    4.3.3 Ссылка на объект базового класса
    4.3.4 Протоклассы
    4.3.5 Предотвращение наследования с помощью ключевого слова sealed
  4.3 Отношения между классами
  4.4 Отношение вложенности
    4.4.1 Расширение понятия о владеющем классе
    4.4.2 Отношения между владеющими и вложенными классами
    4.4.3 Особенности использования владеющих и вложенных классов
  4.5 Абстрактные классы
  4.6 Класс object
  4.7 Функциональные замыкания
    4.7.1 Разработка функциональных замыканий с помощью наследования
    4.7.2 Разработка функциональных замыканий с помощью экземпляров класса
  4.8 Заключение
  4.9 Рекомендации программисту
Полиморфизм
  5.1 Полиморфизм наследующих классов
    5.1.1 Правила приведения типов
  5.2 Переопределение методов родительского класса. Раннее связывание
    5.2.1 Недостатки переопределения методов
  5.3 Виртуальные методы и их переопределение
    5.3.1 Как вызывают виртуальные методы
    5.3.2 Версии виртуальных методов
    5.3.3 Виртуальные функции и принцип полиморфизма
  5.4 Абстрактные методы и их применение
  5.5 Абстрактные классы
  5.6 Перегрузка
    5.6.1 Почему следует использовать перегрузку
    5.6.2 Перегрузка методов
    5.6.3 Перегруженные методы
    5.6.4 Перегруженные конструкторы
    5.6.5 Рекомендации программисту

Подход Си/Win32API.Традиционно разработка программного обеспечения для операционных систем семейства Windows предполагает использование языка программирования Си в сочетании с Windows API (интерфейс программирования приложений). Несмотря на то, что в рамках такого подхода было разработано очень много вполне успешных приложений, процесс их создания непосредственно с помощью API оказывается очень трудоемким делом.

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

Подход С++/MFC. Огромным шагом вперед явился переход к применению языка программирования С++, который можно рассматривать как объектно-ориентированную надстройку над Си. Поэтому, несмотря на то, что С++ уже способен реализовывать основные преимущества объектно-ориентированного программирования (инкапсуляцию, наследование, полиморфизм), но он все еще продолжает сохранять многие недостатки заимствованные из языка Си. Несмотря на это, существует множество вспомогательных средств для программирования на С++. Например, MFC (библиотека базовых классов) предоставляет разработчикам наборы готовых С++ классов, которые упрощают создание Win32 API приложений. Несмотря на очевидную пользу MFC и других инструментальных средств, программирование на языке С++ продолжает оставаться достаточно трудной задачей. В том числе и из-за "тяжелой наследственности", обусловленной связью с языком Си.

Подход Visual Basic 6.0. Visual Basic 6.0 (VB6) стал популярным благодаря тому, что он дает возможность строить сложные интерфейсы пользователя, библиотеки программного кода (например, СОМ-серверы) и системы доступа к данным, затрачивая минимум усилий. В сравнении с MFC, VB6 еще глубже скрывает от разработчика сложность Win32 API, используя для этого целый ряд интегрированных серверов, внутренних типов данных классов, и специфических для VB6 функций.

Главным недостатком является то, что он является скорее "объектно-осведомленным языком", а не полностью объектно-ориентированным.Так, например, он не позволяет реализовать классического наследования. Кроме того, он не позволяет строить многопоточные приложения.

Подход Java/J2EE. Язык программирования Java является объектно-ориентированным и имеет синтаксические корни в С++. Поддержка межплатформенной независимости - далеко не единственное преимущество Java. Язык Java избавлен от многих синтаксических несообразностей С++, поскольку его платформа предлагает программисту большое количество встроенных пакетов, содержащих различные определения типов. С помощью этих типов можно строить приложения со сложным интерфейсом пользователя и обеспечивать связь с базами данных, обмен сообщениями или работу клиентов в Web.

Потенциальной проблемой Java является то, что его использование в цикле разработки обычно означает использование Java и для взаимодействия между клиентом и сервером. Поэтому Java не позволяет возлагать большие надежды на возможности языковой интеграции, так как это противоречит декларируемой цели Java как единого языка программирования для решения всех задач.

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

Подход СОМ. СОМ (Модель компонентных объектов) представляет собой архитектуру, заявившую следующее: если класс будет построен в соответствии с правилами СОМ, то получится блок двоичного кода, который можно будет многократно использовать.

Преимущество двоичного СОМ-сервера в том, что способ доступа к нему уже не зависит от языка. Однако, независимость СОМ от языка несколько ограничена. Например, нет возможности получить новый СОМ-класс из уже существующего, поскольку СОМ не предполагает поддержки классического наследования. Вместо этого, для использования типов СОМ-класса приходится использовать несколько неуклюжее отношение "обладания".

Другим преимуществом СОМ является прозрачность дислокации. Используя такие конструкции, как идентификаторы приложения (AppID), "заглушки" (stub) и "заместители" (proxy) в среде выполнения СОМ, программист может избежать непосредственного обращения к сокетам, RPC-вызовам и другим низкоуровневым элементам.

Хотя СОМ и можно считать очень успешной объектной моделью, внутренне она очень сложна. С целью упрощения процесса разработки бинарных СОМ-объектов было создано множество каркасов разработки приложений с поддержкой СОМ. Например, библиотека ATL (библиотека активных шаблонов), которая обеспечивает еще одно множество С++ классов, шаблонов и макросов, упрощающих создание СОМ-типов.

Многие другие языки в значительной степени скрывают инфраструктуру СОМ от программиста. Однако, поддержки самого языка оказывается недостаточно для того, чтобы скрыть всю сложность СОМ.

Подход Windows DNA. С появлением Internet фирма Microsoft добавила в свое семейство операционных систем и других продуктов множество новых возможностей. В результате появилась совместимая с СОМ архитектура распределенных сетевых приложений (Windows DNA). Однако создание Web-приложений в рамках этой архитектуры, оказалось довольно непростым делом.

Некоторая доля этой сложности вытекает из того факта, что Windows DNA требует использования множества технологий и языков (ASP, HTML, XML, Java, COM, ADO). Одной из проблем является то, что с синтаксической точки зрения многие из этих технологий совершенно не связаны между собой. В результате получилась чрезвычайно запутанная смесь технологий. При этом каждый язык и каждая технология имеют свои собственные (уникальные) системы типов.

Решение технологии .NET.

Технология .NET является достаточно радикальной "силовой" попыткой сделать работу программиста легче. Решение, предложенное технологией .NET, предполагает "изменить все". Технология .NET – это совершенно новая модель для создания систем как в семействе операционных систем Windows, так и множестве других операционных систем (ОС), таких как Mac OS X и различные варианты Unix\Linux.

Технология .NET предоставляет следующие базовые возможности:

  • Полноценная возможность взаимодействия с существующим программным кодом. Существующие бинарные СОМ-объекты могут комбинироваться (взаимодействовать) с более новыми бинарными .NET-объектами и наоборот. Кроме того, сервисы PInvoke (сервисы вызова платформ) позволяют вызывать библиотеки на базе Си (включая API ОС) непосредственно из программного кода .NET.
  • Полная и тотальная интеграция языков. В отличие от СОМ, платформа .NET поддерживает межъязыковое наследование, межъязыковую обработку исключений и межъязыковую отладку.
  • Общий механизм выполнения программ для всех языков с поддержкой .NET. Одной из особенностей этого механизма является четкий набор типов, "понятных" каждому языку.
  • Библиотека базовых классов. Эта библиотека позволяет избежать сложностей прямого обращения к API и предлагает согласованную объектную модель, используемую всеми языками с поддержкой с .NET.
  • Отсутствие детализации СОМ. В собственном бинарном .NET-объекте не будет места для IClassFactory, IUnknown, IDispatch, IDL-кода и "злобных" типов данных наподобие VARIANT (BSTR, SAFEARRAY и т.д.)
  • Упрощенная модель инсталляции. Согласно спецификации .NET, нет необходимости регистрировать соответствующую бинарную единицу в реестре системы. К тому же .NET вполне допускает существование множества версий одной *.dll на одной машине.

На основе перечисленных достоинств можно сделать вывод о том, что платформа .NET не имеет ничего общего с СОМ. Единственным способом взаимодействия типов .NET и СОМ оказывается использование возможностей слоя взаимодействия.

В результате технология .NET позволяет программистам:

-Разрабатывать приложения на любом (или почти на любом) языке программирования.

-Обеспечить независимость своих приложений от особенностей разных операционных систем, а также от особенностей архитектуры и системы команд процессора.

-универсальный доступ к данным.

-защиту информации (типов).

-упростить процесс проектирования и отладки сложных приложений

-Упростить разработку распределенных приложений

-Повысить эффективность процесса разработки Интернет-приложений

Главные компоненты платформы .NET (CLR, CTS и CLS)

Ранее, при использовании языков, таких как Visual Basic или C++, исходный код, написанный на одном из языков, преобразовывался специализированным компилятором в выполняемый код. Каждый язык функционировал в своей собственной среде поддержки (runtime), обеспечивающей работу сгенерированного выполняемого кода. При этом необходимым для каждого языка являлось наличие собственного компилятора, а также собственных средств поддержки времени выполнения (runtime).

В среде .NET, однако, компилятор соответствующего языка преобразует исходный текст программы в промежуточный формат, именуемый "промежуточным языком" {"Intermediate Language", часто пользуются аббревиатурой IL, CIL или MSIL). Этот "язык" заменяет "выполняемый код" который традиционно генерировали компиляторы.

Общеязыковая среда выполнения (CLR)

CLR – это общая языковая среда поддержки времени выполнения, которая заменяет runtime-средства, зависящие от конкретного языка. Она берёт на себя обязанности по выполнению программы, представленной на промежуточном языке IL. С точки зрения программиста .NET можно рассматривать как новую среду выполнения программ и всеобъемлющую библиотеку базовых классов. Главная ее задача заключается в размещении, загрузке и управлении .NET-типами по заданному указанию. Кроме того, CLR отвечает за ряд низкоуровневых операций, таких, как управление памятью и проверка безопасности.

Таким образом, в результате компиляции исходного текста программы (например на языке С++) получается переносимый выполняемый РЕ (Portable Executable) файл, который представляет ту же самую программу, но написанную уже на промежуточном языке IL. Когда этот переносимый файл (РЕ-файл) выполняется, то CLR компилирует ее содержимое в машинный код уже непосредственно перед выполнением. Этот процесс называется компиляцией "Just In Time" или JIT-компиляцией. Здесь следует заметить, что часть исходного текста программы, написанного на языке, поддерживаемом .NET, компилируется дважды. Первая компиляция медленнее, чем вторая, так как IL, сгенерированный после первой компиляции, весьма близок к машинному коду.

Зачем же компилировать исходные тексты программ на промежуточный язык CIL, а не прямо в набор команд операционной системы (машинный код)? Дело в том, что такой подход позволяет "перевести" программы, разработанные на разных языках, на некий единый и общий для всех платформ язык. Это позволяет легко организовать взаимодействие между программами, написанными на разных языках программирования. Причем сделать это на уровне двоичных кодов. Кроме того, значительная часть платформы .NET реализована на множестве операционных систем, отличных от Windows, что позволяет легко организовать взаимодействие между программами, написанными не только на разных языках, но и функционирующих в среде разных операционных систем. Но поскольку компоновочные блоки содержат инструкции на языке IL, а не инструкции для конкретной платформы, то программные коды на языке IL перед их использованием приходится в фоновом режиме компилировать JIТ-компилятором.

В настоящее время CLR реализована для платформы Windows. Это означает, что машинный код, генерируемый CLR, может выполняться только на платформе Windows. Тем не менее, предпринимаются попытки сделать CLR доступным для каждой из альтернативных Windows платформ.

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

Основной механизм CLR размещается в библиотеке, известной под названием общего объектного модуля механизма выполнения (mscoree.dll). Когда ссылаются на какой-либо компоновочный блок для его последующего использования, то в результате автоматически загружается mscoree.dll, который, в свою очередь, загружает в память этот компоновочный блок. Механизм выполнения отвечает за выполнение следующих задач. Прежде всего – за выяснение места расположения компоновочного блока и нахождение запрашиваемого типа в его бинарном объекте с помощью чтения содержащихся там метаданных. Затем среда выполнения CLR размещает экземпляр типа в памяти, преобразует CIL- код в соответствующие платформе инструкции, выполняет все необходимые проверки безопасности, а затем выполняет полученный программный код.

Кроме загрузки компоновочных блоков и создания экземпляров пользовательских типов, CLR может взаимодействовать с типами, содержащимися в библиотеках базовых классов .NET. Вся библиотека базовых классов разбита на целый ряд отдельных компоновочных блоков, но mscorlib.dll в ней является "ключевым" компоновочным блоком. Файл mscorlib.dll содержит множество базовых типов, которые объединяют в себе решения широкого спектра общих задач программирования, а также базовые типы данных, используемые всеми языками .NET. При построении .NET-приложений автоматически предоставляется доступ к этому специальному компоновочному блоку.

На рис.1.1 показана система связей, возникающих между исходным текстом программы на любом из языков, поддерживающим технологию .NET, .NET-компилятором и механизмом выполнения.

 
 

Общая система типов и общеязыковые спецификации (CTS и CLS)

Другим строительным блоком платформы .NET является CTS (общая система типов). Спецификации CTS полностью описывает все возможные типы данных и программные конструкции, поддерживаемые средой выполнения, указывают, как эти элементы могут взаимодействовать между собой и как они представляются в формате метаданных .NET.

CTS это общая система типов, представляющая собой формальное описание того, как должны определяться типы, предназначенные для использования в общеязыковой среде CLR. Для программиста, использующего технологию .NET, в основном, важно знать, как работать с пятью типами, определяемыми спецификациями CTS для выбранного языка программирования. Такими типами являются классы, структуры, интерфейсы, перечисления и делегаты. Кроме перечисленных типов, CTS определяют четкий набор базовых типов данных для обозначения целых и дробных чисел, строковых и логических переменных.

Следует заметить, что конкретный язык, совместимый с .NET, может и не поддерживать абсолютно все возможности, определенные CTS. В связи с этим используются связанные спецификации CLS (общеязыковые спецификации), которые определяют подмножество общих типов и программных конструкций, понятных всем языкам программирования, совместимым с .NET. Поэтому, если создаваемые вами .NET-типы опираются только на возможности, соответствующие CLS, то можно быть уверенным, что использовать их сможет любой совместимый с .NET язык. Если же использовать типы данных и программные конструкции, выходящие за пределы CLS, то нельзя будет гарантировать, что с вашей библиотекой программного .NET-кода сможет взаимодействовать любой другой язык программирования .NET.

Библиотека базовых классов

В добавление к спецификации CLR и CTS\CLS, платформа .NET предлагает библиотеку базовых классов (FCL), которая доступна всем языкам программирования .NET. Эта библиотека не только инкапсулирует различные примитивы, такие как потоки, файловый вывод, визуализация графики и взаимодействие с различными внешними устройствами, но и обеспечивает поддержку целого ряда сервисов, необходимых для большинства современных приложений.

Например, библиотеки базовых классов определяют типы, упрощающие доступ к базам данных, работу с XML, поддержку программной безопасности и создание Web-приложений. Схема высокоуровневых связей между CLR, CTS, CLS и библиотекой базовых классов показана на рис.1.2.


Таким образом CLR, CTS и CLS – это три ключевых и взаимосвязанных составляющих, которые обеспечивают преимущества платформы .NET.

Роль языка С#

Поскольку принципы .NET радикально отличаются от предшествующих технологий, то Microsoft специально разработала новый язык программирования С# для этой платформы. Язык С# является языком программирования, по синтаксису очень похожим на Java. С#, как и Java, основан на синтаксических конструкциях С++.

Многие синтаксические конструкции С# построены с учетом решений, принятых в Visual Basic 6.0 и С++. Например, формальные типы свойств, возможность объявления методов с переменным числом аргументов (через массивы параметров). Подобно С++, в С# позволяется перегрузка операций, создание структур, перечней и функций обратного вызова (посредством делегатов).

Благодаря тому, что C# является гибридом множества языков, то он является продуктом, который синтаксически так же "чист", как Java, почти так же прост, как VB6, и обладает почти такой же мощью и гибкостью, как С++. По сути, язык С# предлагает возможности, многие из которых присущи и всем другим языкам программирования, обеспечивающим поддержку .NET.

  • Не требует никаких указателей! Программы на С# не требуют прямого обращения к указателям, хотя и имеется возможность получить к ним доступ на более низком уровне).
  • Автоматическое управление памятью через сборку мусора. Поэтому в С# не поддерживается ключевое слово delete.
  • Формальные синтаксические конструкции для перечней, структур и свойств классов.
  • Аналогичная С++ перегрузка операций для пользовательских типов, но без лишней сложности.
  • Имеется возможность строить общие типы и общие члены с использованием синтаксиса, похожего на шаблоны С++.
  • Полная поддержка техники программирования, основанной на использовании интерфейсов.
  • Полная поддержка технологии аспектно-ориентированного программирования (АОП) через атрибуты. Это позволяет назначать характеристики типам и их членам, чтобы уточнить их поведение.

Самым важным для правильного понимания языка С#, поставляемого Microsoft в связке с платформой .NET, является то, что получаемый с помощью C# текст программы может выполняться только в среде выполнения .NET. Официальный термин, который используется для описания программы, предназначенной для среды выполнения .NET – управляемый программный код. Бинарный объект, содержащий такой управляемый программный код, называется компоновочным блоком. С другой стороны, программный код, который не может непосредственно управляться средой выполнения .NET, называется неуправляемым программным кодом.


Сейчас читают про: