Программа. Сборка. Класс
Программа – правильно построенная (не вызывающая возражений со стороны C#-компилятора) последовательность предложений, на основе которой формируется сборка.
В общем случае, программист создает файл, содержащий объявления классов, который подается на вход компилятору. Результат компиляции представляется транслятором в виде сборки. В принципе сборка может быть двух видов (здесь все зависит от замысла разработчика кода):
- Portable Executable File (PE-файл с расширением .exe), пригоден к непосредственному исполнению CLR.
- Dynamic Link Library File (DLL-файл с расширением .dll), предназначен для повторного использования как компонент в составе какого-либо приложения.
В любом случае на основе входного кода транслятор строит модуль на IL, манифест, и формирует сборку. В дальнейшем сборка либо может быть выполнена после JIT-компиляции, либо может быть использована в составе других программ.
Пространство имен
.NET Framework располагает большим набором полезных функций. Каждая из них является членом какого-либо класса. Классы группируются по пространствам имен. Это означает, что в общем случае имя класса может иметь сложную структуру — состоять из последовательности имен, разделенных между собой точками. Последнее имя в этой последовательности собственно и является именем класса. Классы, имена которых различаются лишь последними членами (собственно именами классов) последовательностей, считаются принадлежащими одному пространству имен.
Средством "навигации" по пространствам имен, а точнее, средством, которое позволяет сокращать имена классов, является оператор
using <ИмяПространстваИмен>;
В приложении может объявляться собственное пространство имен, а также могут использоваться ранее объявленные пространства.
В процессе построения сборки транслятор должен знать расположение сборок с заявленными для использования пространствами имен. Расположение части сборок известно изначально. Расположение всех остальных требуемых сборок указывается явно (непосредственно в Visual Studio при работе над проектом открыть окно Solution Explorer, выбрать пункт References, далее Add Reference... – там надо задать или выбрать соответствующий .DLL- или .EXE-файл).
В частности, сборка, которая содержит классы, сгруппированные в пространстве имен System, располагается в файле mscorlib.dll.
Наиболее часто используемое пространство имен – System. Расположение соответствующей сборки известно. Если не использовать оператор
using System;
корректное обращение к функции WriteLine(...) – члену класса Console выглядело бы следующим образом:
System.Console.WriteLine("Ha-Ha-Ha!"); // Полное квалифицированное //имя функции – члена класса Console, отвечающей за вывод строки в окно приложения.
При компиляции модуля транслятор по полному имени функции (если используется оператор using – то по восстановленному на его основе) находит ее код, который и используется при выполнении сборки.
Класс и Структура. Первое приближение
Классы и структуры являются программно определяемыми типами, которые позволяют определять (создавать) новые типы, специально приспособленные для решения конкретных задач. В рамках объявления класса и структуры описывается множество переменных различных типов (набор данных — членов класса), правила порождения объектов — представителей структур и классов, их основные свойства и методы.
В программе класс объявляется с помощью специальной синтаксической конструкции, которая называется объявлением класса. Фактически, объявление структур и классов является основным элементом любой C# программы. В программе нет ничего, кроме объявлений и конструкций, облегчающих процедуру объявления.
С точки зрения синтаксиса, между объявлениями классов и структур существуют незначительные различия (ключевые слова struct и class, в структуре не допускается объявлений членов класса со спецификаторами доступа protected и protected internal, при объявлении структуры не допускается объявление конструктора без параметров), часть из которых будет рассмотрены далее.
Основное их различие состоит в том, что класс и структура принадлежат к двум различным категориям типов – типов-ссылок и типов-значений.
В этом разделе обсуждаются основные правила объявления классов.
Объявление класса состоит из нескольких элементов:
- Объявление атрибутов – необязательный элемент объявления.
- Модификаторы (в том числе модификаторы прав доступа) – необязательный элемент объявления.
- Partial (спецификатор разделения объявления класса) – необязательный элемент объявления.
- Class (struct для структуры).
- Имя класса.
- Имена предков (класса и интерфейсов) – необязательный элемент объявления.
- Тело класса (структуры).
Атрибуты – средство добавления ДЕКЛАРАТИВНОЙ (вспомогательной) информации к элементам программного кода. Назначение атрибутов: организация взаимодействия между программными модулями, дополнительная информация об условиях выполнения кода, управление сериализацией (правила сохранения информации), отладка и многое другое.
Модификаторы new, abstract, sealed, static обсуждаются дальше. Модификаторы прав доступа обеспечивают реализацию принципа инкапсуляции, используются при объявлении классов, структур и их составляющих компонентов. Представлены следующими значениями:
Спецификатор разделения объявления класса partial позволяет разбивать код объявления класса на несколько частей, каждая из которых размещается в собственном файле. Если объявление класса занимает большое количество строк, его размещение по нескольким файлам может существенно облегчить работу над программным кодом, его документирование и модификацию. Транслятор способен восстановить полное объявление класса. Спецификатор partial может быть использован при объявлении классов, структур и интерфейсов.
Сочетание ключевого слова class ( struct, interface ) и имени объявляемого класса (структуры или интерфейса) задает имя типа.
Конструкции
:имя класса (при объявлении класса) :список имен интерфейсов (при объявлении структуры или класса) :имя класса, список имен интерфейсов (при объявлении класса)
с обязательным разделителем ' :' обеспечивают реализацию принципа наследования и будут обсуждаться позже.
Тело класса в объявлении ограничивается парой разделителей ' { ', ' } ', между которыми располагаются объявления данных — членов и методов класса.
Следующий пример демонстрирует использование основных элементов объявления структуры. При объявлении структуры допускается лишь один явный спецификатор – public (здесь он опущен). Отсутствие спецификаторов доступа в объявлениях членов структуры (класса) эквивалентно явному указанию спецификаторов private.
// Указание на используемые пространства имен. using System; using System.Drawing; namespace qwe // Объявление собственного пространства имен. Начало. { // Начало объявления структуры struct S1 {// Тело структуры – НАЧАЛО // Объявление данных-членов. private Point p; // protected int qwe; // Спецификатор protected в объявлении членов // структуры недопустим. Структура не имеет развитого механизма //наследования. // Структура не может иметь конструктора без параметров. public S1(int x, int y) { p = new Point(10,10); } // Объявление методов. // Статический метод. Точка входа. static void Main(string[] args) { // Тело метода. Здесь обычно располагается программный код, // определяющий функциональность класса. } }// Тело структуры – КОНЕЦ } // Объявление собственного пространства имен. Конец.