Что означает тильда перед именем функции в С#?

Я просматриваю какой-то код и имеет это утверждение:

~ConnectionManager()
{
    Dispose(false);
}

Класс реализует интерфейс IDisposable, но я не знаю, является ли это частью того, для которого используется тильда (~).

Ответ 1

~ - деструктор

  • Деструкторы вызываются автоматически и не могут быть явно вызваны.
  • Деструкторы не могут быть перегружены. Таким образом, класс может иметь, самое большее, один деструктор.
  • Деструкторы не наследуются. Таким образом, класс не имеет деструкторов, отличных от того, который может быть объявлен в нем.
  • Деструкторы не могут использоваться с structs. Они используются только с классами. Экземпляр становится пригодным для уничтожения, когда уже невозможно использовать какой-либо код для использования экземпляра.
  • Выполнение деструктора для экземпляра может произойти в любое время после того, как экземпляр получит право на уничтожение.
  • Когда экземпляр разрушен, деструкторы в цепочке наследования вызываются, по порядку, от большинства полученных до наименее полученных.

Завершить

В С# метод Finalize выполняет операции, которые будет выполнять стандартный деструктор С++. В С# вы не называете его Finalize - вы используете синтаксис деструктора С++ размещения символа тильды (~) перед именем класса.

Dispose

Предпочтительнее удалять объекты в методе Close() или Dispose(), который может быть явно вызван пользователем класса. Finalize (деструктор) вызывается GC.

Интерфейс IDisposable сообщает миру, что ваш класс содержит ресурсы, которые необходимо удалить, и предоставляет пользователям способ их выпуска. Если вам необходимо реализовать финализатор в своем классе, метод Dispose должен использовать метод GC.SuppressFinalize(), чтобы гарантировать, что финализация вашего экземпляра будет подавлена.

Что использовать?

Неправильно вызывать деструктор явно. Ваш деструктор будет вызываться сборщиком мусора. Если вы обрабатываете драгоценные неуправляемые ресурсы (например, дескрипторы файлов), которые вы хотите закрыть и утилизировать как можно быстрее, вы должны реализовать интерфейс IDisposable.

Ответ 2

Это финализатор. Честно говоря, вам очень редко нужно писать финализатор. Вам действительно нужно только написать один, если:

  • У вас есть прямой доступ к неуправляемому ресурсу (например, через IntPtr), и вы не можете использовать SafeHandle, что упрощает его
  • Вы реализуете IDisposable в классе, который не запечатан. (Мое предпочтение заключается в том, чтобы запечатывать классы, если они не предназначены для наследования.) Финализатор является частью канонического шаблона Dispose в таких случаях.

Ответ 3

Он используется для указания деструктора для класса.

Ответ 4

То же, что и С++, это деструктор; однако в С# вы не вызываете его явно, он вызывается, когда объект собирается.

Ответ 7

Одна точка в Finalizer выше, в ситуации, которая вам может понадобиться назвать. Вам нужно, чтобы они освобождали неуправляемые ресурсы, которые более распространены, чем вы думаете, обычно для баз данных. SQLConnection - пример, по которому вы всегда должны вызывать Dispose(), когда вы закончите с ним.

Одна статья: http://www.codeproject.com/KB/cs/idisposable.aspx