Что означает тильда перед именем функции в C #? - PullRequest
148 голосов
/ 09 октября 2008

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

~ConnectionManager()
{
    Dispose(false);
}

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

Ответы [ 6 ]

190 голосов
/ 09 октября 2008

~ деструктор

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

Завершить

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

Утилизировать

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

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

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

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

43 голосов
/ 09 октября 2008

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

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

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

4 голосов
/ 09 октября 2008

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

3 голосов
/ 09 октября 2008

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

1 голос
/ 09 октября 2008

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

Вот описание найденных C # деконструкторов

...