- •Предисловие
- •Объектная ориентация программ на C#
- •1.1. Типы, классы, объекты
- •1.2. Программа на C#
- •1.3. Пространство имен
- •1.4. Создание консольного приложения
- •Типы в языке C#
- •2.1. Типы ссылок и типы значений
- •2.2. Классификация типов C#
- •2.3. Простые типы. Константы-литералы
- •2.4. Объявления переменных и констант базовых типов
- •Операции и целочисленные выражения
- •3.1. Операции языка C#
- •3.2. Операции присваивания и оператор присваивания
- •3.3. Операции инкремента (++) и декремента (--)
- •3.4. Выражения с арифметическими операциями
- •3.5. Поразрядные операции
- •Выражения с операндами базовых типов
- •4.1. Автоматическое и явное приведение арифметических типов
- •4.2. Особые ситуации в арифметических выражениях
- •4.3. Логический тип и логические выражения
- •4.4. Выражения с символьными операндами
- •5.2. Простые (базовые) типы C# как классы
- •Операторы
- •6.1. Общие сведения об операторах
- •6.2. Метки и оператор безусловного перехода
- •6.4. Операторы цикла
- •6.5. Операторы передачи управления
- •6.6. Переключатель
- •Массивы
- •7.1. Одномерные массивы
- •7.2. Массивы как наследники класса Array
- •7.3. Виды массивов и массивы многомерные
- •7.5. Массивы массивов и поверхностное копирование
- •Строки – объекты класса string
- •8.1. Строковые литералы
- •8.2. Строковые объекты и ссылки типа string
- •8.3. Операции над строками
- •8.5. Форматирование строк
- •8.6. Строка как контейнер
- •8.7. Применение строк в переключателях
- •8.8. Массивы строк
- •8.8. Сравнение строк
- •8.10. Аргументы метода Main()
- •Методы C#
- •9.2. Соотношение фиксированных параметров и аргументов
- •9.3. Параметры с типами ссылок
- •9.4. Методы с переменным числом аргументов
- •9.5. Перегрузка методов
- •9.6. Рекурсивные методы
- •9.7. Применение метода Array.Sort()
- •Класс как совокупность статических членов
- •10.1. Статические члены класса
- •10.2. Поля классов (статические поля)
- •10.3. Статические константы
- •10.4. Статические методы
- •10.5. Статический конструктор
- •10.6. Статические классы
- •Классы как типы
- •11.1. Объявление класса
- •11.2. Поля объектов
- •11.3. Объявления методов объектов
- •11.4. Пример класса и его объектов
- •11.5. Ссылка this
- •11.6. Конструкторы объектов класса
- •11.7. Деструкторы и финализаторы
- •Средства взаимодействия с объектами
- •12.1. Принцип инкапсуляции и методы объектов
- •12.2. Свойства классов
- •12.3. Автореализуемые свойства
- •12.4. Индексаторы
- •12.5. Индексаторы, имитирующие наличие контейнера
- •Включение, вложение и наследование классов
- •13.1. Включение объектов классов
- •13.2. Вложение классов
- •13.3. Наследование классов
- •13.4. Доступность членов класса при наследовании
- •13.5. Методы при наследовании
- •13.6. Абстрактные методы и абстрактные классы
- •13.7. Опечатанные классы и методы
- •13.8. Применение абстрактых классов
- •Интерфейсы
- •14.1. Два вида наследования в ООП
- •14.2. Объявления интерфейсов
- •14.3. Реализация интерфейсов
- •14.4. Интерфейс как тип
- •14.5. Интерфейсы и наследование
- •Перечисления и структуры
- •15.1. Перечисления
- •15.2. Базовый класс перечислений
- •15.3. Структуры
- •15.4. Упаковка и распаковка
- •15.5. Реализация структурами интерфейсов
- •Исключения
- •16.1. О механизме исключений
- •16.3. Свойства исключений
- •16.5. Исключения в арифметических выражениях
- •16.6. Генерация исключений
- •16.7. Пользовательские классы исключений
- •Делегаты и события
- •17.1. Синтаксис делегатов
- •17.2. Массивы делегатов
- •17.3. Многоадресные групповые экземпляры делегатов
- •17.4. Делегаты и обратные вызовы
- •17.5. Анонимные методы
- •17.6. События
- •Литература
- •Предметный указатель
212 |
Г л а в а 1 1 |
|
|
такой конструктор нужно объявлять явно, что и сделано. Конструктор умолчания выполняет инициализацию полей класса в соответствии с теми значениями, которые указаны в декларации класса. Однако, в теле конструктора умолчания полям объекта можно было бы присвоить и другие значения.
Пример применения конструкторов класса (программа 11_07.cs):
static void Main()
{
Real number = new Real(303.0, 1); // Конструктор общего вида
number.display("number");
Real number1 = new Real(0.000321);// Конструктор приведения типов
number1.display("number1");
Real numCopy = new Real(number);// Конструктор копирования
number1 = number; |
// Присваивание |
|
ссылок |
|
|
number.incrementM(); |
// Изменение |
|
объекта |
|
|
number.display("number"); |
|
|
number1.display("number1"); |
||
numCopy.display("numCopy"); // Копия сохранила |
||
значение |
|
|
Real numb = new Real(); |
// Конструктор умолчания |
|
numb.display("numb"); |
|
|
} |
|
|
Результат выполнения программы: |
||
number |
= 3,03000 * 10^03 |
|
number1 = 3,21000 * 10^-04 |
|
|
number |
= 4,03000 * 10^03 |
|
number1 = 4,03000 * 10^03 |
|
|
numCopy = 3,03000 * 10^03 |
|
|
numb |
= 8,00000 * 10^00 |
|
Классы как типы |
213 |
|
|
11.7. Деструкторы и финализаторы
Деструктор — это член класса, где запрограммированы все действия, которые необходимо выполнить для уничтожения объекта класса. Объявление деструктора:
extern opt ~имя_класса( ) тело_деструктора
Как показано в формате, имя_деструктора — это имя класса
спрефиксом ~ (тильда). Других имен у деструкторов не бывает. Деструктор в классе может быть только один. Параметров у деструктора нет. Нет и возвращаемого значения. Тело деструктора это блок либо пустой оператор, обозначаемый символом точка
сзапятой. Пустой оператор в качестве тела деструктора используется в том случае, если деструктор снабжен модификатором extern. В противном случае тело деструктора – это блок, включающий операторы, необходимые для уничтожения объекта. Практически тело деструктора аналогично телу метода без параметров с возвращаемым значением типа void.
Деструктор выполняется после того как соответствующий объект класса перестает использоваться в программе. Вызов деструктора выполняется автоматически. Момент вызова конкретно не определен. Явно вызвать деструктор из кода программы нельзя.
Вследующей программе класс включает определение деструктора. Несмотря на то, что явно деструктор в программе не вызывается, его выполнение иллюстрирует результат следующей программы (11_08.cs).
// 11_08.cs деструктор using System;
class A { ~A() {
Console.WriteLine("Destructor!");
}
}
class Test
{
static void Main()
{
214 |
Г л а в а 1 1 |
|
|
A b = new A(); b = null;
}
}
Результат выполнения программы:
Destructor!
В архитектуре .NET деструкторы реализуются с помощью метода с названием Finalize(). Этот метод, называемый финализатором, подменяет в сборке реально использованный в коде деструктор. Программируя на уровне языка C#, можно не обращать на это внимание, но это важно понимать, если исследовать код на языке IL.
Деструктор нужен только в том классе, который требует для создаваемого объекта выделения неуправляемых ресурсов. Например, когда конструктор объекта связывает создаваемый объект с дескриптором файла или устанавливает сетевое соединение. Когда объект выходит из области определения, необходимы действия по освобождению дескриптора файла или сетевого соединения. Именно такие действия должен выполнять деструктор.
Контрольные вопросы
1.Назовите модификаторы класса, применяемые при отсутствии наследования.
2.Назовите возможные члены класса.
3.Какие элементы являются обязательными в объявлении нестатического поля?
4.Когда выполняется инициализация нестатических полей?
5.Каков статус доступа нестатического поля при отсутствии в его объявлении модификаторов доступа?
6.Можно ли объявить статическое поле с типом класса, которому оно принадлежит?
7.В каком случае в классе могут одновременно присутствовать одноименные статический и нестатический методы?
8.В каких случаях телом нестатического метода может быть пустой оператор?
9.Назовите возможные применения ссылки this.
Классы как типы |
215 |
|
|
10.В каких методах ссылка this отсутствует?
11.Опишите формат объявления нестатического конструктора.
12.Перечислите модификаторы конструктора.
13.Объясните назначение инициализатора конструктора.
14.Перечислите виды конструкторов.
15.В каком случае конструктор умолчания (конструктор без параметров) создается автоматически?
16.Каков статус доступа у конструктора умолчания, встраиваемого в класс автоматически?
17.Что такое конструктор копирования?
18.Каким образом конструктор может обратиться к другому конструктору своего класса?
19.Объясните назначение деструктора.
20.Сколько деструкторов может быть в одном классе?
21.Что такое финализатор?