Финализатор
Финализатор записывают как ~ИмяТипа без
параметров и возвращаемого типа. Его не вызывают
явно из кода: момент запуска не задан и может
не наступить, если объект ещё достижим. Для
освобождения ресурсов обычно используют явные
схемы вроде IDisposable; финализатор -
запасной путь на случай, когда объект забыли
освободить вручную.
Синтаксис
class Имя
{
~Имя()
{
// код финализатора
}
}
Пример
Давайте создадим объект обычным конструктором и выведем его метку - это предсказуемый результат:
using System;
class Worker
{
public string Label;
public Worker(string label)
{
Label = label;
}
~Worker()
{
// CLR может вызвать это позже или не вызвать
}
}
class Program
{
static void Main()
{
var worker = new Worker("abcde");
Console.WriteLine(worker.Label);
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте покажем тело финализатора рядом с
конструктором - вывод в Main снова идёт
только из конструктора:
using System;
class BufferHolder
{
public int Size;
public BufferHolder(int size)
{
Size = size;
}
~BufferHolder()
{
// освобождение неуправляемого ресурса, если нужно
}
}
class Program
{
static void Main()
{
var holder = new BufferHolder(5);
Console.WriteLine(holder.Size);
}
}
Результат выполнения кода:
5
Пример
Давайте объявим финализатор в классе с несколькими экземплярами - порядок их финализации не задаётся кодом программы:
using System;
class Node
{
public int Id;
public Node(int id)
{
Id = id;
}
~Node()
{
}
}
class Program
{
static void Main()
{
var left = new Node(1);
var right = new Node(2);
Console.WriteLine($"{left.Id} {right.Id}");
}
}
Результат выполнения кода:
1 2
Смотрите также
-
конструктор,
который создаёт объект и задаёт начальное состояние -
класс
Object,
от которого наследуют финализатор все типы -
статический конструктор,
который инициализирует тип один раз -
оператор
new,
которым создают экземпляр до возможной финализации