- •Обзор элементов класса.
- •Класс Object
- •Структуры
- •Методы Ссылочные параметры ref и out
- •Переменное число аргументов метода
- •Перегрузка методов. Вызов методов с одинаковым именем и разными аргументами
- •Конструкторы экземпляра
- •Вызов конструктора экземпляра
- •Закрытые конструкторы экземпляра
- •Статические конструкторы
- •Конструкторы структур
- •Член со спецификатором readonly
- •Деструкторы. Сборка мусора
- •Объект Account
- •Объект Account недоступен
- •Свойства
- •Индексаторы
- •Предпосылки появления наследования
- •Синтаксис наследования.
- •Типы наследования
- •Множественное наследование
- •Наследование интерфейса
- •Виртуальные методы
- •Спецификаторы доступности
- •Вызов базовых версий функций
- •Абстрактные классы и функции
- •Структуры и наследование
- •Полиморфизм
- •Потеря и восстановление информации о типе
- •Операции is и as
- •Файловый ввод-вывод
- •Потоки данных и файловый ввод-вывод
- •Виды файлов
- •Классы файлового ввода-вывода
- •Класс FileInfo
- •Текстовый ввод-вывод при помощи Stream Reader и Stream Writer
- •Бинарный ввод и вывод при помощи класса FileStream
Деструкторы. Сборка мусора
Классы задаются в исходном коде до исполнения программы, а объекты создаются динамически, на этапе исполнения посредством операции new (как было сказано ранее). Каждый порожденный объект занимает определенный объем памяти, необходимый для хранения таких элементов, как, например, переменные экземпляра. Поскольку память ограничена, очень важно удалять из нее объекты, больше не используемые в программе. Это необходимо для освобождения памяти для вновь порождаемых объектов.
Прежде чем говорить о том, как в С# освобождается память, необходимо детальнее разобраться с понятием "объект больше не используется". На самом деле это значит, что объект становится недоступным для программы, так как больше не существует ссылок на него.
Рассмотрим программу, которая демонстрирует как все ссылки на объект могут быть утрачены, и таким образом он станет недоступен.
using System;
class Account
{
}
class Bank
{
private Account bankAccount;
public void SetAccount(Account newAccount)
{
bankAccount = newAccount;
}
}
class Tester
{
public static void Main()
{
Bank bankl;
Account accountl;
Account account2;
accountl=new Account();
accountl = null;
accountl = new Account();
account2 = new Account();
accountl = account2;
bankl = new Bank();
bankl.SetAccount(new Account());
bankl = null;
}
}
Эта программа ничего не выводит на экран.
Метод Main() класса Tester иллюстрирует четыре причины, приводящих к недоступности объекта.
Присвоение всем ссылкам на объект значения null.
В строке: Account accountl; создается объект, ссылка на который присваивается переменной accountl. В строке accountl = null; ей присваивается значение null, и она больше не содержит указателя на исходный объект. Объект Account становится недоступным, поскольку на него больше нет ссылок. Графически это выглядет следующим образом:
Account accountl
Ссылка на account1Объект Account
aОбъект Account недоступен
ccountl
= null
Ссылка на account1
null
Переменной, хранящей единственную ссылку на объект, присваивается другая ссылка, и объект становится недоступным.
accountl = new Account();
account2 = new Account();
accountl = account2;
Рассмотрим этот вариант графически:
accountl = new Account();
account2 = new Account();
Ссылка на account1
Объект Account
Ссылка на account2
Объект Account
accountl = account2;
Ссылка на account1
Объект Account
Ссылка на account2
Объект Account
3. Если объект А содержит единственную ссылку на объект В, то когда А становится недоступным, то же самое происходит с В.
В программе переменной bankl присваивается ссылка на новый объект Bank, Этот объект содержит ссылку на объект Account, присвоенную методом SetAccount. После выполнения строки bankl = null объект bankl больше не ссылается на объект Bank , и, значит, объект Account также становится недоступным.
Если объект Account ссылался на другой объект, а тот, в свою очередь, на третий и т. д., то цепочка объектов, связанных с помощью ссылок, будет доступна до тех пор, пока доступен первый объект.
bankl = new Bank();
Ссылка на bank1
Объект Bank
ссылка
null
bankl.SetAccount(new Account());
Ссылка на bank1
Объект Bank
ссылка
Объект Account
bankl = null;
Ссылка на bank1
Объект Bank
ссылка
Объект Account
null
Рассмотрим основные задачи сборщика мусора. Для освобождения памяти от недоступных более объектов в языке С# используется механизм, поддерживаемый средой исполнения .NET и называемый сборщиком мусора (СМ).
Методика автоматического управления памятью называется сборкой мусора (СМ).
Сборщик мусора выполняет две основные функции:
обнаружение недоступных объектов;
восстановление занимаемой ими памяти.
Рассмотрим основные принципы СМ.
Механизм CM .NET-платформы не удаляет доступные объекты.
СМ .NET-платформы, автоматически обнаруживает и удаляет все недоступные объекты. Поэтому не следует беспокоиться о запуске или прекращении работы этой системы.
Недоступный объект не удаляется сразу. Когда СМ работает, он занимает время процессора, которое могло бы быть потрачено на выполнение программы, что приводит к ее временному "замораживанию". Поэтому сборщик мусора должен найти баланс между освобождением памяти для новых объектов и минимальным использованием ресурсов процессора.
Сборщик мусора существует не во всех объектно-ориентированных языках программирования. Например, в языке C++ программист сам должен создать исходный код, обнаруживающий, когда объект становится не нужным, и запускающий специальный метод, называемый деструктором, для освобождения соответствующего блока памяти. Деструктор запускается сразу же после вызова, причем в нем могут содержаться команды освобождения и других ресурсов (файлов, сетевых соединений и т. д.). Следовательно, программирующий на C++ достаточно жестко управляет тем, когда объект освобождает память и другие ресурсы.
О6ъявленив_двструктора::=
<Идентификатор_деструктора>()
{
<Операторы>
}
Примечание
<Идентификатор_деструктора> подобно конструктору должен совпадать с идентификатором класса.
Деструктор не имеет формальных параметров.