Я смотрю на некоторый код, и он имеет следующее утверждение:
~ConnectionManager()
{
Dispose(false);
}
Класс реализует IDisposable
интерфейс, но я не знаю, является ли это частью того, для чего используется тильда (~).
Я смотрю на некоторый код, и он имеет следующее утверждение:
~ConnectionManager()
{
Dispose(false);
}
Класс реализует IDisposable
интерфейс, но я не знаю, является ли это частью того, для чего используется тильда (~).
Ответы:
~ деструктор
Доработка
В C # метод Finalize выполняет операции, которые выполняет стандартный деструктор C ++. В C # вы не называете его Finalize - вы используете синтаксис деструктора C ++, помещая символ тильды (~) перед именем класса.
Dispose
Предпочтительно располагать объекты в методе Close()
или, Dispose()
который может быть явно вызван пользователем класса. Finalize (деструктор) вызывается GC.
Интерфейс IDisposable сообщает миру, что ваш класс хранит ресурсы, которые необходимо утилизировать, и предоставляет пользователям способ их освобождения. Если вам нужно реализовать финализатор в вашем классе, ваш метод Dispose должен использовать GC.SuppressFinalize()
метод, чтобы гарантировать, что финализация вашего экземпляра подавлена.
Что использовать?
Недопустимо явно вызывать деструктор. Ваш деструктор будет вызван сборщиком мусора. Если вы обрабатываете драгоценные неуправляемые ресурсы (например, файловые дескрипторы), которые хотите закрыть и утилизировать как можно быстрее, вам следует реализовать интерфейс IDisposable.
Finalize
метод вызывается рекурсивно для всех экземпляров в цепочке наследования, от самого производного до наименее производного» . Обратите внимание, что это не то же самое поведение, которое вы бы получили от наследуемых деструкторов.
Это финализатор . Если честно, очень редко нужно писать финализатор. Вам действительно нужно написать только один, если:
IntPtr
), и вы не можете использовать SafeHandle
его, что облегчаетIDisposable
в классе, который не запечатан. (Я предпочитаю запечатывать классы, если они не предназначены для наследования.) В таких случаях финализатор является частью канонического шаблона Dispose.Он используется для указания деструктора для класса.
try/finally
блок, который гарантирует, что Finalize
будет вызван родительский метод. Большинство вещей, которые верны для деструкторов, верны и для финализаторов, и наоборот, но слова означают немного разные вещи.
Как и в C ++, это деструктор; однако в C # вы не вызываете его явно, он вызывается, когда объект собирается.
См. Деструкторы (Руководство по программированию в C #) . Имейте в виду, однако, что, в отличие от C ++, программист не может контролировать, когда вызывается деструктор, потому что это определяется сборщиком мусора.
~ обычно представляет собой деконструктор. который запускается прямо перед тем, как объект умирает.