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

Я смотрю на некоторый код, и он имеет следующее утверждение:

~ConnectionManager()
{
    Dispose(false);
}

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

6 ответов


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

  1. деструкторы вызываются автоматически и не могут вызываться явно.
  2. деструкторы не могут быть перегружены. Таким образом, класс может иметь не более одного деструктора.
  3. деструкторы не наследуются. Таким образом, класс не имеет деструкторов, кроме того, который может быть объявлен в нем.
  4. деструкторы нельзя использовать со структурами. Они используются только с классами. Экземпляр становится подходящим для уничтожение, когда любой код больше не может использовать экземпляр.
  5. выполнение деструктора для экземпляра может произойти в любое время после того, как экземпляр получает право на уничтожение.
  6. когда экземпляр разрушается, деструкторы в его цепочке наследования вызываются по порядку от большинства производных к наименее производным.

завершить

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

Dispose

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

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

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

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


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

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

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


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


посмотреть Деструкторы (Руководство По Программированию На C#). Однако имейте в виду, что, в отличие от C++, programmer не контролирует, когда вызывается деструктор, потому что это определяется сборщиком мусора.


~ обычно представляет собой разрушитель. который запускается прямо перед тем, как объект умирает.

Вот описание c# deconstructors я нашел