Автор работы: Пользователь скрыл имя, 28 Марта 2012 в 11:49, курс лекций
Лекции по дисциплине "Программирование"
Лекция 1. Состав языка Типы данных Переменные и операции
Лекция 2. Линейные программы
Лекция 3. Простейшие операторы. Операторы ветвления
Лекция 4. Операторы цикла и передачи управления
Лекция 5. Обработка исключительных ситуаций
Лекция 6. Классы: основные понятия Описание класса
Лекция 7. Параметры методов
Лекция 8. Конструкторы и свойства
Лекция 9. . Массивы
Лекция 10. Символы и строки
Лекция 11 Дополнительные возможности методов. Индексаторы
Лекция 12. Операции класса. Деструкторы
Лекция 13. Наследование классов
Лекция 14. Интерфейсы
Лекция 15. Стандартные интерфейсы .NET
Лекция 16. Структуры и перечисления
Лекция 17. Делегаты
Лекция 18. События
[ атрибуты ] [ спецификаторы ] class имя_класса [ : предки ]
тело_класса
Как видите, обязательными являются только ключевое слово class, а также имя и тело класса. Тело класса — это список описаний его элементов, заключенный в фигурные скобки. Список может быть пустым, если класс не содержит ни одного элемента. Таким образом, простейшее описание класса может выглядеть так:
class Demo {}
Спецификаторы определяют свойства класса, а также доступность класса для других элементов программы. Возможные значения спецификаторов перечислены в таблице 8.1. Класс можно описывать непосредственно внутри пространства имен или внутри другого класса. В последнем случае класс называется вложенным.
Таблица 8.1. Спецификаторы класса
№ | Спецификатор | Описание |
1 | new | Используется для вложенных классов. Задает новое описание класса взамен унаследованного от предка. Применяется в иерархиях объектов |
2 | public | Доступ не ограничен |
3 | protected | Используется для вложенных классов. Доступ только из элементов данного и производных классов |
4 | internal | Доступ только из данной программы (сборки) |
5 | protected internal | Доступ только из данного и производных классов или из данной программы (сборки) |
6 | private | Используется для вложенных классов. Доступ только из элементов класса, внутри которого описан данный класс |
7 | abstract | Абстрактный класс. Применяется в иерархиях объектов, рассматривается в главе 8 |
8 | sealed | Бесплодный класс. Применяется в иерархиях объектов, рассматривается в главе 8 |
9 | static | Статический класс. Введен в версию языка 2.0. Рассматривается в разделе «Конструкторы» |
Спецификаторы 2–6 называются спецификаторами доступа. Они определяют, откуда можно непосредственно обращаться к данному классу. Спецификаторы доступа могут присутствовать в описании только в вариантах, приведенных в таблице, а также могут комбинироваться с остальными спецификаторами.
Сейчас мы будем изучать только классы, которые описываются в пространстве имен непосредственно (то есть не вложенные классы). Для таких классов допускаются два спецификатора: public и internal. По умолчанию подразумевается internal.
Класс является обобщенным понятием, определяющим характеристики и поведение некоторого множества конкретных объектов этого класса, называемых экземплярами, или объектами, класса. Объекты создаются явным или неявным образом, то есть либо программистом, либо системой. Программист создает экземпляр класса с помощью операции new, например:
Demo a = new Demo(); // создание экземпляра класса Demo
Demo b = new Demo(); // создание другого экземпляра класса Demo
Для каждого объекта при его создании в памяти выделяется отдельная область, в которой хранятся его данные. Кроме того, в классе могут присутствовать статические элементы, которые существуют в единственном экземпляре для всех объектов класса. Часто статические данные называют данными класса, а остальные — данными экземпляра.
Функциональные элементы класса не тиражируются, то есть всегда хранятся в единственном экземпляре. Для работы с данными класса используются методы класса (статические методы), для работы с данными экземпляра — методы экземпляра, или просто методы.
Поля и методы являются основными элементами класса. Кроме того, в классе можно задавать целую гамму других элементов: свойства, события, индексаторы, операции, конструкторы, деструкторы, а также типы (рис. 8.1).
Ниже приведено краткое описание всех элементов класса, изображенных на рисунке:
Константы класса хранят неизменяемые значения, связанные с классом.
Поля содержат данные класса.
Методы реализуют вычисления или другие действия, выполняемые классом или экземпляром.
Свойства определяют характеристики класса в совокупности со способами их задания и получения, то есть методами записи и чтения.
Конструкторы реализуют действия по инициализации экземпляров или класса в целом.
Деструкторы определяют действия, которые необходимо выполнить до того, как объект будет уничтожен.
Индексаторы обеспечивают возможность доступа к элементам класса по их порядковому номеру.
Операции задают действия с объектами с помощью знаков операций.
События определяют уведомления, которые может генерировать класс.
Типы — это типы данных, внутренние по отношению к классу.
Прежде чем начать изучение элементов класса, необходимо поговорить о присваивании и сравнении объектов.
Механизм выполнения присваивания один и тот же для величин любого типа, как ссылочного, так и значимого, однако результаты различаются. При присваивании значения копируется значение, а при присваивании ссылки — ссылка, поэтому после присваивания одного объекта другому мы получим две ссылки, указывающие на одну и ту же область памяти (рис. 8.2).
Аналогичная ситуация с операцией проверки на равенство. Величины значимого типа равны, если равны их значения. Величины ссылочного типа равны, если они ссылаются на одни и те же данные (на рисунке объекты b и c равны, но a не равно b даже при равенстве их значений или если они обе равны null).
Данные, содержащиеся в классе, могут быть переменными или константами и задаются в соответствии с правилами, рассмотренными в разделе «Переменные» и «Именованные константы». Переменные, описанные в классе, называются полями класса. При описании элементов класса можно также указывать атрибуты и спецификаторы, задающие различные характеристики элементов. Синтаксис описания элемента данных:
[ атрибуты ] [ спецификаторы ] [ const ] тип имя [ = начальное_значение ]
Возможные спецификаторы полей и констант перечислены в таблице 8.2. Для констант можно использовать только спецификаторы 1–6.
Таблица 8.2. Спецификаторы полей и констант класса
№ | Спецификатор | Описание |
1 | new | Новое описание поля, скрывающее унаследованный элемент класса |
2 | public | Доступ к элементу не ограничен |
3 | protected | Доступ только из данного и производных классов |
4 | internal | Доступ только из данной сборки |
5 | protectedinternal | Доступ только из данного и производных классов и из данной сборки |
6 | private | Доступ только из данного класса |
7 | static | Одно поле для всех экземпляров класса |
8 | readonly | Поле доступно только для чтения |
9 | volatile | Поле может изменяться другим процессом или системой |
По умолчанию элементы класса считаются закрытыми (private). Для полей класса этот вид доступа является предпочтительным. Все методы класса имеют непосредственный доступ к его закрытым полям.
Обращение к полю класса выполняется с помощью операции доступа (точка). Справа от точки задается имя поля, слева — имя экземпляра для обычных полей или имя класса для статических. В листинге 8.1 приведен пример простого класса Demo и два способа обращения к его полям.
Листинг 8.1. Класс Demo, содержащий поля и константу
using System;
namespace ConsoleApplication1
{
class Demo
{
public int a = 1; // поле данных
public const double c = 1.66; // константа
public static string s = "Demo"; // статическое поле класса
double y; // закрытое поле данных
}
class Class1
{ static void Main()
{
Demo x = new Demo(); // создание экземпляра класса Demo
Console.WriteLine( x.a ); // x.a - обращение к полю класса
Console.WriteLine( Demo.c ); // Demo.c - обращение к константе
Console.WriteLine( Demo.s ); // обращение к статическому полю
}
}
}
Поля со спецификатором readonly предназначены только для чтения. Установить значение такого поля можно либо при его описании, либо в конструкторе (конструкторы рассматриваются далее).
Метод — это функциональный элемент класса, который реализует вычисления или другие действия, выполняемые классом или экземпляром. Методы определяют поведение класса.
Метод представляет собой законченный фрагмент кода, к которому можно обратиться по имени. Он описывается один раз, а вызываться может столько раз, сколько необходимо. Один и тот же метод может обрабатывать различные данные, переданные ему в качестве аргументов.
Синтаксис метода:
[ атрибуты ] [ спецификаторы ] тип имя_метода ( [ параметры ] )
тело_метода
Первая строка представляет собой заголовок метода. Тело метода, задающее действия, выполняемые методом, чаще всего представляет собой блок.
При описании методов можно использовать спецификаторы 1–7 из таблицы 8.2, имеющие тот же смысл, что и для полей, а также спецификаторы virtual, sealed, override, abstract и extern, которые будут рассмотрены по мере необходимости. Чаще всего для методов задается спецификатор доступа public, ведь методы составляют интерфейс класса — то, с чем работает пользователь.
Пример простейшего метода:
public double Gety() // метод для получения поля y из листинга 5.1
{
return y;
}
Тип определяет, значение какого типа вычисляется с помощью метода. Часто употребляется термин «метод возвращает значение». Если метод не возвращает никакого значения, в его заголовке задается тип void, а оператор return отсутствует.
Параметры используются для обмена информацией с методом. Параметр представляет собой локальную переменную, которая при вызове метода принимает значение соответствующего аргумента. Область действия параметра — весь метод.
Например, чтобы вычислить значение синуса для вещественной величины x, мы передаем ее в качестве аргумента в метод Sin класса Math, а чтобы вывести значение этой переменной на экран, мы передаем ее в метод WriteLine класса Console:
double x = 0.1;
double y = Math.Sin(x);
Console.WriteLine(x);
При этом метод Sin возвращает в точку своего вызова вещественное значение синуса, которое присваивается переменной y, а метод WriteLine ничего не возвращает.
Параметры, описываемые в заголовке метода, определяют множество значений аргументов, которые можно передавать в метод. Список аргументов при вызове как бы накладывается на список параметров, поэтому они должны попарно соответствовать друг другу. Для каждого параметра должны задаваться его тип и имя. Например, заголовок метода Sin выглядит следующим образом:
public static double Sin( double a );
Имя метода вкупе с количеством, типами и спецификаторами его параметров представляет собой сигнатуру метода. В классе не должно быть методов с одинаковыми сигнатурами.
В листинге 8.2 в класс Demo добавлены методы установки и получения значения поля y.
Листинг 8.2. Простейшие методы
using System;
namespace ConsoleApplication1
{
class Demo
{
public int a = 1;
public const double c = 1.66;
static string s = "Demo";
double y;
public double Gety() // метод получения поля y
{
return y;
}
public void Sety( double y_ ) // метод установки поля y
{
y = y_;
}
public static string Gets() // метод получения поля s
{
return s;
}
}
class Class1
{ static void Main()
{
Demo x = new Demo();
x.Sety(0.12);
Console.WriteLine(x.Gety());
Console.WriteLine(Demo.Gets())
// Console.WriteLine(Gets());
}
}
}
Лекция 7. Параметры методов
Параметры методов
При вызове метода выполняются следующие действия:
Вычисляются выражения, стоящие на месте аргументов.
Выделяется память под параметры метода в соответствии с их типом.
Каждому из параметров сопоставляется соответствующий аргумент (аргументы как бы накладываются на параметры и замещают их).