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



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



~ConnectionManager()
{
Dispose(false);
}


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

609   6  

6 ответов:

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

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

завершить

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

распоряжения

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.