powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как пишется деструктор классы в С# ?
3 сообщений из 3, страница 1 из 1
Как пишется деструктор классы в С# ?
    #32335436
Фотография Nrisimha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как пишется деструктор класса в С# ?
...
Рейтинг: 0 / 0
Как пишется деструктор классы в С# ?
    #32335497
Valera-x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Destructors are used to destruct instances of classes. A destructor is declared using the following form:

[attributes] ~ identifier( ) { destructor-body }
where:

attributes (Optional)
Additional declarative information. For more information on attributes and attribute classes, see C# Attributes.
identifier
The identifier is the same as the class name.
destructor-body
The block that contains the statements that destruct the instance of the class.

Example
The following example creates three classes that make a chain of inheritance. The class First is the base class, Second is derived from First, and Third is derived from Second. All three have destructors. In Main(), an instance of the most derived class is created. When the program runs, notice that the destructors for the three classes are called automatically, and in order, from the most derived to the least derived.

// Destructors1.cs
using System;

class First
{
~First()
{
Console.WriteLine("First's destructor is called");
}
}

class Second: First
{
~Second()
{
Console.WriteLine("Second's destructor is called");
}
}

class Third: Second
{
~Third()
{
Console.WriteLine("Third's destructor is called");
}
}

public class MainClass
{
public static void Main()
{
Third myObject = new Third();
}
}
Output
Third's destructor is called
Second's destructor is called
First's destructor is called
...
Рейтинг: 0 / 0
Как пишется деструктор классы в С# ?
    #32407742
Петрович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Деструкторы существуют в C#, однако из-за применения системы сборки мусора невозможно предсказать, когда они будут запущены, и их использование не приветствуется. Поскольку в C# за освобождение ресурсов отвечает сборщик мусора, обычно вообще не возникает необходимости в деструкторах, т.е. программисту не требуется явно иметь дело с освобождением памяти.

Однако все же в ряде случаев может потребоваться выполнить некоторые действия перед тем, как переменные будут уничтожены (например, закрыть файлы), и C# представляет для этого два способа: метод Dispose() или Close() и метод Finalize() . Эти методы созданы для совместной работы.

Из всех вариантов освобождения ресурсов метод Finalize() наиболее близко соответствует концепции традиционного деструктора. Однако имеется пара препятствий:

1) Finalize() является недетерминированным. Это означает, что невозможно предсказать, когда экземпляр класса будет уничтожен. Кроме того, не следует рассчитывать на то, что Finalize() будут вызываться в каком-то определенном порядке для различных экземпляров класса.

2) Не рекомендуется реализовывать метод Finalize() , если только класс действительно не нуждается в нем. Если объект реализует Finalize() , это наносит сильный удар по производительности при сборке мусора для данного объекта. Кроме того, задерживается окончательное удаление объекта из памяти. Сборка мусора работает таким образом, что объекты, для которых необходимо вызвать метод Finalize() , помещаются в специальную очередь для завершения работы с ними. Сборщик мусора не уничтожает объекты, находящиеся в этой очереди. Вместо этого вызываются их методы Finalize() , и только потом они удаляются из очереди.

Если вы действительно хотите определить метод Finalize() , то используйте синтаксис, который соответствует определению деструктора в C++: указывается имя класса с тильдой (~) перед ним:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class MyClass
{
  ~MyClass()
  {
    //выполняем очистку
  }
}


Методы Dispose() и Close() являются скорее соглашением, чем частью языка C#, хотя в C# имеется некоторая встроенная поддержка Dispose() . Они работают таким образом, что при желании вы можете определить один из них для класса, понимая при этом, что клиентский код обязан явно вызвать этот метод для освобождения ресурсов. Ресурсы освобождаются сразу после того, как отпадает надобность в них, что является большим преимуществом при наличии, например, монопольной блокировки файла. Недостаток же заключается в том, что вы полагаетесь на то, что клиентский код будет вести себя корректно и вызовет этот метод, однако этого может и не произойти.

Типичное решение — использовать Dispose() и Close() совместно с Finalize() . Необходимо сделать следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public void Dispose()
{
  //Освобождаем ресурсы
  GC.SuppressFinalize(this);
}

protected override void Finalize()
{
  //Освобождаем ресурсы
  base.Finalize();
}


Если клиентский код не забудет вызвать Dispose() , ресурсы будут освобождены вовремя. Если же забудет, то Finalize() будет вызван при сборке мусора. Метод SuppressFinalize() из класса System.GC информирует среду исполнения .NET о том, что для объекта, переданного в качестве параметра, не нужно вызывать Finalize() .

Разница между Close() и Dispose() состоит главным образом в соглашении по их применению. Close() предполагает, что ресурс может быть позже открыт снова, в то время как вызов Dispose() означает, что клиент закончил работу с этим конкретным ресурсом навсегда. Можно реализовать как один, так и оба метода, но не запутайте других разработчиков. Вы можете реализовать Close() в ситуациях, в которых этот метод является традиционной практикой программирования и соответствует традиционной терминологии — например, закрытие файла или соединения с базой данных. Dispose() следует применять, например, для освобождения дескрипторов различных объектов GDI или Windows. Этот метод потребуется также в том случае, если вы пожелаете воспользоваться преимуществами архитектуры IDisposable .
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как пишется деструктор классы в С# ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]