Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
ПЛАТФОРМА MICROSOFT .NET FRAMEWORK
Совокупность средств, с помощью которых программы пишутся,
корректируются, преобразуются в машинные коды, отлаживаются и запускаются,
называют средой разработки или оболочкой. Платформа .Net или .Net Framework
– это больше чем просто среда разработки программ, это новое революционное
объединение ранее разрозненных технологий компанией Microsoft, которые
позволяют разрабатывать разнотипные приложения на различных языках
программирования под различные операционные системы.
.NET Framework является надстройкой над операционной системой, в качестве
которой может выступать любая версия Windows, Unix и вообще любая ОС (по
заверению разработчиков), и состоит из ряда компонентов. Так, .NET Framework
включает в себя:
1. Официальные языки: С#, VB.NET, Managed C++.
2. Общеязыковую объектно-ориентированную среду выполнения CLR
(Common Language Runtime), совместно используемую этими языками для
создания приложений.
3. Ряд связанных между собой библиотек классов под общим именем FCL
(Framework Class Library).
Основным компонентом платформы .NET Framework является общеязыковая
среда выполнения программ CLR. Название среды – «общеязыковая среда
выполнения» – говорит само за себя: это исполняющая среда, которая подходит
для различных языков программирования. К функциям CLR относятся:
– двухшаговая компиляция: преобразование программы, написанной на одном
из языков программирования в управляемый код на промежуточном языке
(Microsoft Intermediate Language, MSIL, или просто IL), а затем преобразование
IL-кода в машинный код конкретного процессора, который выполняется с
помощью виртуальной машины или JIT-компилятора (Just In Time compiler –
компилирование точно к нужному моменту);
– управление кодом: загрузка и выполнение уже готового IL-кода с помощью
JIT-компилятора;
– осуществление доступа к метаданным с целью проверки безопасности кода;
– управление памятью при размещении объектов с помощью сборщика мусора
(Garbage Collector);
– обработка исключений и исключительных ситуаций, включая межъязыковые
исключения;
– осуществление взаимодействия между управляемым кодом (код, созданный
для СLR) и неуправляемым кодом;
– поддержка сервисов для разработки разнотипных приложений.
Следующим компонентом .Net Framework является FCL – библиотека классов
платформы. Эта библиотека разбита на несколько модулей таким образом, что
имеется возможность использовать ту или иную ее часть в зависимости от
требуемых результатов. Так, например, в одном из модулей содержатся
«кирпичики», из которых можно построить Windows-приложения, в другом –
«кирпичики», необходимые для организации работы в сети и т.д.
Часть FCL посвящена описанию базисных типов. Тип – это способ
представления данных; определение наиболее фундаментальных из них облегчает
совместное использование языков программирования с помощью .NET
Framework. Все вместе это называется Common Type System (CTS – единая
система типов).
Кроме того, библиотека FCL включает в себя Common Language Specification
(CLS – общая языковая спецификация), которая устанавливает: основные правила
языковой интеграции. Спецификация CLS определяет минимальные требования,
предъявляемые к языку платформы .NET. Компиляторы, удовлетворяющие этой
спецификации, создают объекты, способные взаимодействовать друг с другом.
Поэтому любой язык, соответствующий требованиям CLS, может использовать
все возможности библиотеки FCL.
Как уже отмечалось, основными языками, предназначенными для платформы
.NET Framework, являются С#, VB.NET, Managed C++. Для данных языков
Microsoft предлагает собственные компиляторы, переводящие программу в ILкод, который выполняется JIT-компилятором среды CLR. Кроме Microsoft, еще
несколько компаний и академических организаций создали свои собственные
компиляторы, генерирующие код, работающий в CLR. На сегодняшний момент
известны компиляторы для Pascal, Cobol, Lisp, Perl, Prolog и т.д. Это означает, что
можно написать программу, например, на языке Pascal, а затем, воспользовавшись
соответствующим компилятором, создать управляемый код, который будет
работать в среде CLR.
Понятия приложения, проекта, решения
.NET Framework не налагает никаких ограничений на возможные типы
создаваемых приложений. Тем не менее, давайте рассмотрим некоторые наиболее
часто встречающиеся типы приложений:
Консольные приложения позволяют выполнять вывод на «консоль», то есть в
окно командного процессора.
Windows-приложения, использующие элементы интерфейса Windows, включая
формы, кнопки, флажки и т.д.
Web-приложения представляют собой web-страницы, которые могут
просматриваться любым web-браузером.
Web-сервисы представляют собой распределенные приложения, которые
позволяют обмениваться по Интернету практически любыми данными с
использованием единого синтаксиса независимо от того, какой язык
программирования применялся при создании web-службы и на какой системы она
размещена.
Приложение, находящееся в процессе разработки, называется проектом.
Несколько приложений могут быть объединены в решение (solution).
Удобной средой разработки приложений является Visual Studio .Net.
Среда разработки Visual Studio .Net
В данном курсе мы будем изучать язык С#. Знакомство с языком начнем с
разработки консольных приложений. В качестве среды разработки мы будем
использовать Visual Studio .Net (VS).
Можно создавать файлы с исходным кодом на С# с помощью обычного
текстового редактора, например, Блокнота, и компилировать их в управляемые
модули с помощью компилятора командной строки, который является составной
частью .NET Framework. Однако наиболее удобно для этих целей использовать
VS, потому что:
VS автоматически выполняет все шаги, необходимые для компиляции
исходного кода.
Текстовый редактор VS настроен для работы с теми языками, которые
поддерживаются VS, например С#, поэтому он может интеллектуально
обнаруживать ошибки и подсказывать в процессе ввода, какой именно код
необходим.
В состав VS входят программы, позволяющие создавать Windows- и Webприложения
путем
простого
перетаскивания
мышью
элементов
пользовательского интерфейса.
Многие типы проектов, создание которых возможно на С#, могут
разрабатываться на основе «каркасного» кода, заранее включаемого в программу.
Вместо того чтобы каждый раз начинать с нуля, VS позволяет использовать уже
имеющиеся файлы с исходным кодом, что уменьшает временные затраты на
создание проекта.
Создание первого проекта
Для создания проекта следует запустить VS, а затем в главном меню VS
выбрать команду Файл – Создать – Проект (File – New – Project). После чего
откроется диалоговое меню создания проекта (см. рис. 1).
Рис. 1
В поле Типы проектов (Project types) следует выбрать Visual C#, в поле
Шаблоны (Templates) – Консольное приложение (Console Application).
В строчке Имя (Name) введите имя приложения, например Hello. Обратите
внимание на то, что это же имя появится в строчке Имя решения (Solution Name).
Уберите галочку в поле Создать каталог для решения (Create directory for
Application) (пока мы создаем простое приложение, и нам нет необходимости
усложнять его структуру).
В строке Расположение (Location) определите положение на диске, куда
нужно сохранять ваш проект. И нажмите кнопку OK. Примерный вид экрана
изображен на рис 2.
Рис. 2
В правой верхней части располагается окно управления проектом
Обозреватель решений (Solution Explorer). Если оно закрыто, то его можно
включить командой Вид – Обозреватель решений (View – Solution Explorer).
В этом окне перечислены все ресурсы, входящие в проект:
1) AssemblyInfo.cs – информация о сборке.
Компилятор в качестве результата своего выполнения создает так называемую
сборку – файл с расширением exe или dll, который содержит IL-код и
метаданные.
2) System, System.Data, System.Xml – ссылки на стандартные библиотеки.
3) Program.cs – текст программы на языке C#.
Сюда же может включаться файл с расширением ico, отвечающий за вид
ярлыка приложения.
В правой нижней части экрана располагается окно свойств Свойства
(Properties). Если оно закрыто, то его можно включить командой Вид – Свойства
(View – Properties). В этом окне отображаются важнейшие характеристики
выделенного элемента.
Основное пространство экрана занимает окно редактора, в котором
располагается текст программы, созданный средой автоматически. Текст
представляет собой каркас, в который программист будет добавлять нужный код.
При этом зарезервированные слова отображаются синим цветом, комментарии –
зеленым, основной текст – черным.
Текст структурирован. Щелкнув на знак минус, мы скроем блок кода, щелкнув
на знаке плюс – откроем.
Откроем папку, содержащую проект, и рассмотрим ее структуру (см. рис.3).
Файлы, выделенные жирным шрифтом, появятся только после компиляции.
Рис. 3
На данном этапе особый интерес для нас будут представлять следующие
файлы:
1. Hello.sln – основной файл, отвечающий за весь проект. Если необходимо
открыть проект для редактирования, то нужно выбрать именно этот файл.
Остальные файлы откроются автоматически.
2. Program.cs – файл, в котором содержится исходный код – код, написанный
на языке С#. Именно с этим файлом мы и будем непосредственно работать.
3. Hello.exe – файл, в котором содержатся сгенерированный IL-код и
метаданные проекта. Другими словами, этот файл и есть готовое приложение,
которое может выполняться на любом компьютере, на котором установлена
платформа .Net.
Теперь рассмотрим сам текст программы.
using System – это директива, которая разрешает использовать имена
стандартных классов из пространства имен System непосредственно без указания
имени пространства, в котором они были определены.
Ключевое слово namespace создает для проекта свое собственное
пространство имен, которое по умолчанию называется именем проекта. В нашем
случае пространство имен называется Hello. Однако программист вправе указать
другое имя. Пространство имен ограничивает область применения имен, делая его
осмысленным только в рамках данного пространства. Это сделано для того, чтобы
можно было давать имена программным объектам, не заботясь о том, что они
совпадут с именами в других приложениях. Таким образом, пространства имен
позволяют избегать конфликта имен программных объектов, что особенно важно
при взаимодействии приложений.
С# – объектно-ориентированный язык, поэтому написанная на нем программа
будет представлять собой совокупность взаимодействующих между собой
классов. Автоматически был создан класс с именем Program (в других версиях
среды может создаваться класс с именем Class1).
Данный класс содержит только один метод – метод Main(). Метод Main()
является точкой входа в программу, т.е. именно с данного метода начнется
выполнение приложения. Каждая программа на языке С# должна иметь метод
Main().
Технически возможно иметь несколько методов Main() в одной программе, в
этом случае потребуется с помощью параметра командной строки сообщить
компилятору С#, какой именно метод Main() является точкой входа в программу.
Метод Main() имеет одну важную особенность. Перед объявлением типа
возвращаемого значения void (который означает, что метод не возвращает
значение) стоит ключевое слово static, которое означает что метод Main() можно
вызывать, не создавая объект типа Program. В некоторых версиях требуется,
чтобы перед словом static стояло слово public.
Добавим в метод следующий код:
Console.WriteLine("Hello!");
Здесь Console имя стандартного класса из пространства имен System. Его
метод WriteLine выводит на экран текст, заданный в кавычках
Для запуска программы следует нажать клавишу F5 или выполнить команду
Отладка – Начать отладку (Debug – Start Debugging). Если программа
выполнена без ошибок, то сообщение выведется в консольное окно, которое
мелькнет и быстро закроется. Чтобы просмотреть сообщение в нормальном
режиме нужно нажать клавиши Ctrl+F5 или выполнить команду Отладка –
Запуск без отладки (Debug – Start Without Debugging). В нашем случае откроется
следующее консольное окно:
Если код программы будет содержать ошибки, например, пропущена точка с
запятой после команды вывода, то после нажатия клавиши F5 откроется
диалоговое окно, в котором выведется сообщение о том, что обнаружена ошибка,
и вопрос, продолжать ли работу дальше. Если вы ответите Да (Yes), то будет
выполнена предыдущая удачно скомпилированная версия программы. Иначе
процесс будет остановлен и управление передано окну списка ошибок (Error List).
Компиляция и выполнение программы в среде CLR
В прошлом почти все компиляторы генерировали код для конкретных
процессорных архитектур. Все CLR-совместимые компиляторы вместо этого
генерируют IL-код, который также называется управляемым модулем, потому что
CLR управляет его жизненным циклом и выполнением. Рассмотрим составные
части управляемого модуля:
1. Заголовок PE32 или PE32+: Файл с заголовком в формате PE32 может
выполняться в 32- или 64-разрядной ОС, а с заголовком PE32+ только в 64разрядной ОС. Заголовок показывает тип файла: GUI, GUI или DLL, он также
имеет временную метку, показывающую, когда файл был собран. Для модулей,
содержащих только IL-код, основной объем информации в РЕ-заголовке
игнорируется, Для модулей, содержащих процессорный код, этот заголовок
содержит сведения о процессорном коде.
2. Заголовок CLR: Содержит информацию, которая превращает этот модуль в
управляемый. Заголовок включает нужную версию СLR, некоторые флаги, метку
метаданных, точки входа в управляемый модуль (метод Main),
месторасположение и размер метаданных модуля, ресурсов и т.д.
3. Метаданные – это набор таблиц данных, описывающих то, что определено
в модуле. Есть два основных вида таблиц: описывающие типы и члены,
определенные в вашем исходном коде, и описывающие типы и члены, на которые
имеются ссылки в вашем исходном коде. Метаданные служат многим целям:
– устраняют необходимость в заголовочных и библиотечных файлах при
компиляции, так как все сведения о типах и членах, на которые есть ссылки,
содержатся в файле с IL-кодом, в котором они реализованы. Компиляторы могут
читать метаданные прямо из управляемых модулей;
– при компиляции IL-кода в машинный код CLR выполняет верификацию
(проверку «безопасности» выполнения кода) используя метаданные, например,
нужное ли число параметров передается методу, корректны ли их типы,
правильно ли используется возвращаемое значение и т.д.;
– позволяют сборщику мусора отслеживать жизненный цикл объектов и т.д.;
4. IL-код: управляемый код, создаваемый компилятором при компиляции
исходного кода. Во время исполнения CLR компилирует IL-код в команды
процессора.
По умолчанию CLR-совместимые компиляторы генерируют управляемый код,
безопасность выполнения которого поддается проверке средой CLR. Вместе с
тем, возможно разрабатывать неуправляемый или «небезопасный» код, которому
разрешается работать непосредственно с адресами памяти и управлять байтами в
этих адресах. Эта возможность, обычно полезна при взаимодействии с
неуправляемым кодом или при необходимости добиться максимальной
производительности при выполнении критически важных алгоритмов. Однако
использовать неуправляемый код довольно рискованно, т.к. он способен
разрушить существующие структуры данных.
Чтобы понять принцип выполнения программы в среде CLR рассмотрим
небольшой пример:
Непосредственно перед исполнением функции Main CLR находит все типы,
на которые ссылается ее код. В нашем случае метод Main ссылается на
единственный тип – Console, и CLR выделяет единственную внутреннюю
структуру WriteLine.
Когда Main первый раз обращается к WriteLine, вызывается функция
JITCompiler (условное название), которая отвечает за компиляцию IL-кода
вызываемого метода в собственные команды процессора. Функции JITCompiler
известен вызываемый метод и тип, в котором он определен. JITCompiler ищет в
метаданных соответствующей сборки IL-код вызываемого метода, затем
проверяет и компилирует IL-код в собственные команды процессора, которые
сохраняются в динамически выделенном блоке памяти. После этого JITCompiler
возвращается к внутренней структуре данных типа и заменяет адрес вызываемого
метода адресом блока п-мяти, содержащего собственные команды процессора. В
завершение JITCompiler передает управление коду в этом блоке памяти. Далее
управление возвращается в функцию Main, которая продолжает работу в
обычном порядке.
Затем Main обращается к WriteLine вторично. К этому моменту код WriteLine
уже проверен и скомпилирован, так что производится обращение к блоку памяти,
минуя вызов JITCompiler. Отработав, метод WriteLine возвращает управление
Main.
Таким образом, за счет такой компиляции производительность теряется только
при первом вызове метода. Все последующие обращения к одной и той же
структуре выполняются «на полной скорости», без повторной верификации и
компиляции.
ТЕХНОЛОГИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО
ПРОГРАММИРОВАНИЯ
В основе языка С# лежит технология объектно-ориентированного
программирования (ООП). Все программы на языке С# в большей или меньшей
степени являются объектно-ориентированными, поэтому, приступая к написанию
даже самой простой программы, нужно познакомиться с основными понятиями в
рамках ООП.
ООП основано на таких понятиях как «класс», «объект», «интерфейс»,
«инкапсуляция», «наследование», «полиморфизм», «событие».
Объект в программе – это абстракция реального объекта. Объект обладает
атрибутами, поведением и индивидуальностью. Атрибуты определяют основные
черты объекта, поведение – действия над объектом, индивидуальность – отличие
одного объекта от другого с такими же атрибутами по их конкретным значениям.
Например: два кота, у обоих есть шерсть, но у одного шерсть черного цвета, у
другого – рыжая.
Класс – это множество объектов с одинаковыми атрибутами и поведением,
представляемое в языке программирования в виде абстрактного типа данных,
который включает в себя члены класса. Рассмотрим некоторые из них:
поля – непосредственно данные определенного типа для описания атрибутов;
методы – функции, предназначенные для обработки внутренних данных
объекта данного класса;
свойства – это специальные поля данных, с помощью которых, можно
управлять поведением объектов данного класса.
Класс служит образцом для создания объектов или, другими словами, объект
является экземпляром класса.
Важным свойством объекта является его обособленность. Детали реализации
объекта, то есть внутренние структуры данных и алгоритмы их обработки,
скрыты от пользователя и недоступны для непреднамеренного изменения. Объект
используется через его интерфейс – совокупность правил доступа. Скрытие
деталей реализации называется инкапсуляцией.
В ООП данные и методы одного класса могут передаваться другим классам с
помощью механизма наследования. Порожденный класс (потомок), наследующий
характеристики другого класса, обладает теми же возможностями, что и класс
(предок), от которого он порожден. При этом класс-предок остается без
изменения, а классу-потомку можно добавлять новые элементы (поля, методы,
свойства) или изменять унаследованные методы. Благодаря этому класс-потомок
обладает большими возможностями, чем предок. Так, например, все классы (а их
очень много, и с некоторыми из них мы познакомимся чуть позже) порождены от
корневого класса System.Object.
Классы-потомки некоторого класса являются разновидностями этого классапредка. (Другими словами, класс-предок является обобщением своих потомков).
Это означает, что к объектам классов-потомков можно обращаться с помощью
одного и того же имени (но при этом могут выполняться различные действия) –
что составляет суть полиморфизма. Чаще всего понятие полиморфизма связывают
с механизмом виртуальных методов.
Программу, построенную на принципах ООП, можно представить как
совокупность взаимодействующих объектов. Объект А воздействует на объект Б,
и для Б возникает событие, на которое Б отреагирует либо ответным
воздействием на А, либо воздействием на объект В. Если А – внешний для
системы объект, то Б – интерфейсный объект (отвечающий за взаимодействие
системы с внешним миром).
Операционная система Windows – объектно-ориентированная система, в
которой определены классы для производства объектов, обеспечивающих, в
частности, интерфейс с пользователем. Программа, написанная под Windows,
обращается к ней, командуя какой интерфейсный объект на каком именно месте
создать – так строится внешний вид (интерфейс) программы. Эти интерфейсные
объекты кажутся принадлежащими программе, но на самом деле они – часть
Windows: именно она отвечает за их базовый внешний вид и поведение. Поэтому,
когда пользователь воздействует на интерфейсный объект программы (нажимает
кнопку, выбирает пункт меню и т.п.), для этого объекта происходит событие и
Windows переводит это событие в сообщение для программы. При написании
программы предусматривается однозначная реакция на это сообщение в виде
метода, а в методе вызываются методы других объектов. Т.е. воздействие на
интерфейсный объект приводит к появлению в недрах Windows сообщения,
которое, приходя в программу, запускает цепочку взаимодействий внутренних
для нее объектов. Таким образом, ООП программа фактически встраивается в ОС
Windows.
Вспомним нашу первую программу
class Program //класс
{
static void Main() //метод класса
{
Console.WriteLine(“Hello!!!”);
}
}
Программа содержит класс Program c единственным статическим (static)
методом Main, что позволяет обращаться к данному методу класса без создания
его экземпляра.