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

StackOverflow https://stackoverflow.com/questions/188688

  •  06-07-2019
  •  | 
  •  

Вопрос

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

~ConnectionManager()
{
    Dispose(false);
}

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

Это было полезно?

Решение

~ является деструктором

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

Завершить

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

Вот описание деконструкторов C #, которые я нашел

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top