Файл: 1_C#_Введение_в_программирование_Уч_пособ_(Марченко-2005).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2025
Просмотров: 1299
Скачиваний: 3
правилам COM. При этом для .NET-приложений не требуется регистрации компонентов в системном реестре Windows.
Для выполнения .NET-приложения достаточно разместить относящиеся к данному приложению сборки в одном каталоге. Если при этом сборка может быть использована в нескольких приложениях, то она размещается и регистрируется с помощью специальной утилиты в GAC (Global Assembly Cache Общем КЭШе сборок).
CTS - Common Type System Стандартная Система Типов. Поддерживается всеми языками платформы. В силу того, что .NET дитя ООП – то речь здесь идёт об элементарных типах, классах, структурах, интерфейсах, делегатах и перечислениях.
Common Type System является важной частью среды выполнения, определяет структуру синтаксических конструкций, способы объявления, использования, и применения ОБЩИХ типов среды выполнения. В CTS сосредоточена основная информация о системе ОБЩИХ ПРЕДОПРЕДЕЛЁННЫХ типов, об их использовании и управлении (правилах преобразования значений). CTS играет важную роль в деле интеграции разноязыких управляемых приложений.
Пространство имён – это способ организации системы типов в единую группу. Существует общая общеязыковая библиотека базовых классов. И концепция пространства имён обеспечивает эффективную организацию и навигацию в этой библиотеке. Вне зависимости от языка программирования доступ к определённым классам обеспечивается за счёт их группировки в рамках общих пространств имён.
Пространство имён |
Назначение |
System |
|
System.Data |
Для обращения к базам данных |
System.Data.Common |
|
System.Data.OleDb |
|
System.Data.SqlClient |
|
System.Collections |
Классы для работы с контейнерными объектами |
System.Diagnostics |
Классы для трассировки и отладки кода |
System.Drawing |
Классы графической поддержки |
System.Drawing.Drawing2D |
|
System.Drawing.Printing |
|
System.IO |
Поддержка ввода-вывода |
System.Net |
Поддержка передачи данных по сетям |
System.Reflection |
Работа с пользовательскими типами во время выполнения |
System.Reflection.Emit |
приложения |
System.Runtime.InteropServices |
Поддержка взаимодействия с “обычным кодом” – DLL, |
System.Runtime.Remoting |
COM-серверы, удалённый доступ |
System.Security |
Криптография, разрешения |
System.Threading |
Работа с потоками |
System.WEB |
Работа с web-приложениями |
System.Windows.Form |
Работа с элементами интерфейса Windows |
System.XML |
Поддержка данных в формате XML |
Выполнение неуправляемых исполняемых модулей (обычные Windows приложения), обеспечивается непосредственно системой Windows. Неуправляемые модули выполняются в среде Windows как “простые” процессы. Единственное требование, которому должны отвечать подобные модули – корректная работа в среде Windows. Они должны “правильно” работать (не вешать систему, не допускать утечек памяти, не блокировать другие процессы и корректно использовать средства самой ОС для работы от имени процессов). То есть, соответствовать наиболее общим правилам работы под Windows.
При этом большинство проблем корректного выполнения неуправляемого модуля (проблемы взаимодействия, выделения и освобождения памяти) являются проблемами разработчиков приложений. Например, известная технология COM является способом организации взаимодействия разнородных компонентов в рамках приложения.
Объект – в широком смысле это область памяти (стеке или куче), выделяемая в процессе выполнения программы для записи каких-либо значений. Характеризуется типом (фиксированным набором свойств, определяющих размер занимаемой области, способ интерпретации значения, диапазон значений, множество действий, допустимых при манипуляциях с объектом) местом расположения в памяти (адресом).
Сборка мусора - механизм, позволяющий CLR определить, когда объект становится недоступен в управляемой памяти программы. При сборке мусора
9
управляемая память освобождается. Для разработчика приложения наличие механизма сборки мусора означает, что он больше не должен заботиться об освобождении памяти. Однако это может потребовать изменения в стиле программирования, например, особое внимание следует уделять процедуре освобождения системных ресурсов. Необходимо реализовать методы, освобождающие системные ресурсы, находящиеся под управлением приложения.
Стек - специальным образом организованная область памяти, предназначенный для временного хранения значений объектов (переменных и констант), для передачи параметров при вызове методов, для сохранения адреса возврата. Управление стеком по сравнению с кучей достаточно просто. Оно основано на изменении значения соответствующего регистра вершины стека. При сокращении размера стека объекты просто теряются.
Программа на C#
Программа – правильно построенная (не вызывающая возражений со стороны C# компилятора) последовательность предложений, на основе которой формируется сборка.
Вобщем случае, программист создаёт файл, содержащий объявления класов, который подаётся на вход компилятору. Результат компиляции представляется транслятором в виде сборки и определяется предпочтениями программиста. В принципе сборка может быть двух видов:
Portable Executable File (PE-файл с расширением .exe), пригоден к непосредственному исполнению CLR,
Dynamic Link Library File (DLL-файл с расширением .dll), предназначен для повторного использования как компонент в составе какого-либо приложения.
Влюбом случае на основе входного кода транслятор строит модуль на IL, манифест, и формирует сборку. В дальнейшем, сборка либо может быть выполнена после JIT компиляции, либо может быть использована в составе других программ.
10
Основы языка
Пространство имён
.NET Framework располагает большим набором полезных функций. Каждая из них является членом какого-либо класса. Классы группируются по пространствам имён, которые имеют (как правило) вложенную структуру.
Средством навигации по множествам классов в пространствах имён является оператор
usung <ИмяПространстваИмён>;
Вприложении объявляется собственное пространство имён и используются ранее объявленные пространства.
Впроцессе построения сборки Visual Studio.NET должен знать расположение
сборок с заявленными для использования пространствами имён. Расположение части сборок системе известно изначально. Расположение прочих требуемых приложению сборок указывается явно (окно Solution Explorer проекта, пункт
References, Add Reference…). Там надо указать соответствующий .dll или .exe
файл.
В частности, сборка, содержащая классы, сгруппированные в пространстве имён
System, располагается в файле mscorlib.dll.
Наиболее часто используемое пространство имён – System. Расположение соответствующей сборки известно. Если не использовать оператора
usung System;
корректное обращение к функции WriteLine(…) члену класса Console выглядело бы следующим образом:
System.Console.Writeline(“Ha-Ha-Ha!”); // Полное квалифицированное
//имя функции-члена класса Console, отвечающей за вывод строки в окно приложения.
При компиляции модуля, транслятор по полному имени функции (если используется оператор using – то по восстановленному) находит её код, который и используется при выполнении сборки.
Система типов
Система типов поддерживает две категории типов, каждая из которых разделена на подкатегории: типы значений (типы-значения) и ссылочные типы (типы-ссылки).
Схема типов представлена ниже.
Система типов .NET
Типы-значения |
|
Типы-ссылки |
Классы
Структуры
Строки
Перечисления
Массивы
Простые типы
Делегаты
Интерфейсы
Все типы, за исключением простых типов, могут определяться программистом. Все остальные типы (производные типы) требуют предварительного объявления.
11
Простые (элементарные) типы – это типы, имя и основные свойства которых известны компилятору. Относительно встроенных типов компилятору не требуется никакой дополнительной информации. Он поддерживает эти типы самостоятельно.
Среди простых типов различаются:
ЦЕЛОЧИСЛЕННЫЕ,
С ПЛАВАЮЩЕЙ ТОЧКОЙ,
DECIMAL,
БУЛЕВСКИЙ.
Для обозначения простых (элементарных) типов в C# используется следующая система обозначений. Некоторые характеристики типов отражены в следующей таблице. Смысл точечной нотации в графе “Соответствует FCL-типу” будет разъяснён позже. Пока эту нотацию достаточно воспринимать как составное имя:
Имя типа в |
Соответствует |
Описание |
|
C# |
FCL-типу |
|
|
sbyte |
System.SByte |
Целый. 8-разрядное со знаком. Диапазон значений: |
|
|
|
128 … 127 |
|
byte |
System.Byte |
Целый. 8-разрядное без знака. Диапазон |
значений: |
|
|
0 … 255 |
|
short |
System.Int16 |
Целый. 16-разрядное со знаком. Диапазон значений: - |
|
|
|
32768 … 32767 |
|
ushort |
System.UInt16 |
Целый. 16-разрядное без знака. Диапазон |
значений: |
|
|
0 … 65535 |
|
int |
System.Int32 |
Целый. 32-разрядное со знаком. Диапазон значений: - |
|
|
|
2147483648 … 2147483647 |
|
uint |
System.UInt32 |
Целый. 32-разрядное без знака. Диапазон значений: - |
|
|
|
0 … 4294967295 |
|
long |
System.Int64 |
Целый. 64-разрядное со знаком. Диапазон значений: - |
|
|
|
9223372036854775808 … 9223372036854775807 |
|
ulong |
System.UInt64 |
Целый. 64-разрядное без знака. Диапазон |
значений: |
|
|
0 … 18446744073709551615 |
|
char |
System.Char |
16 (!) разрядный символ UNICODE. |
|
float |
System.Single |
Плавающий. 32 разряда. Стандарт IEEE. |
|
double |
System.Double |
Плавающий. 64 разряда. Стандарт IEEE. |
|
decimal |
System.Decimal |
128-разрядное значение повышенной точности с |
|
|
|
плавающей точкой. |
|
bool |
System.Boolean |
Значение true или false. |
|
При создании объекта элементарного типа производится его начальная инициализация предопределённым значением. И за это отвечают предопределённые недоступные для модификации конструкторы.
В C# различаются ВСТРОЕННЫЕ (элементарные - primitive, предопределённые – predefined) и ПРОИЗВОДНЫЕ типы.
Встроенные типы – это типы, имя и основные свойства которых известны компилятору. Производные типы требуют предварительного объявления. Относительно встроенных типов компилятору не требуется никакой дополнительной информации. Он поддерживает эти типы самостоятельно.
В разных CLS-языках типам, удовлетворяющим CLS спецификации, будут соответствовать одни и те же элементарные типы. Согласованная поддержка типов, НЕ соответствующих CLS спецификации, в разных языках не гарантируется.
Система встроенных типов C# основывается на системе типов .NET Framework Class Library. При создании IL кода компилятор осуществляет их отображение в типы из .NET FCL.
Ниже представлены основные отличия ссылочных типов и типов-значений.
|
Типы-значения |
Типы-ссылки |
Объект содержит |
значение |
ссылку |
Располагается |
в стеке |
в динамической памяти |
Значение по умолчанию |
0, false, ‘\0’ |
null |
При присваивании копируется |
значение |
ссылка |
В C# объявление любой структуры и класса основывается на объявлении предопределённого класса Object (наследует класс Object). Следствием этого является возможность вызова от имени объектов-представителей любой структуры
12
или класса унаследованных от класса Object методов. В частности, метода ToString. Этот метод возвращает строковое (значение типа string) представление объекта.
В C# также существует ещё одно важное ограничение на использование объектов размерных типов. Необходимым условием применения этих объектов является их ЯВНАЯ инициализация.
Класс и Структура. Первое приближение
Эти категории типов-ссылок и типов-значений заслуживают первоочередного внимания. Классы и структуры являются программно-определяемыми типами, которые позволяют определять (создавать) новые типы, специально приспособленные для решения конкретных задач. В рамках объявления класса и структуры описывается множество переменных различных типов (набор данныхчленов класса), правила порождения объектов-представителей структур и классов, их основные свойства и методы, применение которых обеспечивает решение задачи.
В программе класс объявляется с помощью специальной синтаксической конструкции, которая называется объявлением класса. Фактически, объявление структур и классов является основным элементом любой C# программы. В программе нет ничего, кроме их объявлений и конструкций, облегчающих процедуру этого объявления.
С точки зрения синтаксиса, между объявлениями классов и структур существует незначительные различия (ключевое слово struct и class, в структуре не допускается объявлений членов класса со спецификаторами доступа protected, protected internal, особенности объявления конструкторов – не допускается объявления конструктора без параметров), часть из которых будет обсуждаться далее.
В этом разделе обсуждаются основные правила объявления классов. Объявление класса состоит из нескольких элементов:
объявление атрибутов - необязательный элемент объявления,
модификаторы прав доступа - необязательный элемент объявления,
class (struct для структуры),
имя класса,
имена предков (класса и интерфейсов) - необязательный элемент объявления,
тело класса (структуры).
Атрибуты – являются средство добавления ДЕКЛАРАТИВНОЙ (вспомогательной) информации к элементам программного кода. Назначение атрибутов: организация взаимодействия между программными модулями, дополнительная информация об условиях выполнения кода, управление сериализацией (правила сохранения информации), отладка, многое другое.
Модификаторы прав доступа – средство реализации принципа инкапсуляции, используются при объявлении классов, структур и их составляющих компонентов. Представлены следующими значениями:
public |
обозначение |
для общедоступных |
членов класса. К ним можно |
|||
|
обратиться из любого метода любого класса программы. |
|
||||
protected |
обозначение для членов класса, |
доступных |
в |
рамках |
объявляемого |
|
|
класса и из методов производных классов. |
|
|
|
||
internal |
обозначение для членов класса, |
доступных из методов классов, |
||||
|
объявляемых в рамках сборки, |
содержащей |
объявление данного |
|||
|
класса. |
|
|
|
|
|
protected internal |
обозначение |
для членов класса, доступных в рамках объявляемого |
||||
|
класса и из методов производных классов, а также доступных из |
|||||
|
методов классов, объявляемых в рамках сборки, содержащей |
|||||
|
объявление данного класса. |
|
|
|
|
|
private |
обозначение для членов класса, |
доступных |
в |
рамках |
объявляемого |
|
|
класса. |
|
|
|
|
|
Сочетание ключевого слова class и имя объявляемого класса задаёт имя объявляемого типа как класса (struct ИМЯ задаёт имя структуры).
конструкции :имя класса
:список имён интерфейсов :имя класса, список имён интерфейсов
13