Я просматриваю какой-то код и имеет это утверждение:
~ConnectionManager()
{
Dispose(false);
}
Класс реализует интерфейс IDisposable
, но я не знаю, является ли это частью того, для которого используется тильда (~).
Я просматриваю какой-то код и имеет это утверждение:
~ConnectionManager()
{
Dispose(false);
}
Класс реализует интерфейс IDisposable
, но я не знаю, является ли это частью того, для которого используется тильда (~).
~ - деструктор
Завершить
В С# метод Finalize выполняет операции, которые будет выполнять стандартный деструктор С++. В С# вы не называете его Finalize - вы используете синтаксис деструктора С++ размещения символа тильды (~) перед именем класса.
Dispose
Предпочтительнее удалять объекты в методе Close()
или Dispose()
, который может быть явно вызван пользователем класса. Finalize (деструктор) вызывается GC.
Интерфейс IDisposable сообщает миру, что ваш класс содержит ресурсы, которые необходимо удалить, и предоставляет пользователям способ их выпуска. Если вам необходимо реализовать финализатор в своем классе, метод Dispose должен использовать метод GC.SuppressFinalize()
, чтобы гарантировать, что финализация вашего экземпляра будет подавлена.
Что использовать?
Неправильно вызывать деструктор явно. Ваш деструктор будет вызываться сборщиком мусора. Если вы обрабатываете драгоценные неуправляемые ресурсы (например, дескрипторы файлов), которые вы хотите закрыть и утилизировать как можно быстрее, вы должны реализовать интерфейс IDisposable.
Это финализатор. Честно говоря, вам очень редко нужно писать финализатор. Вам действительно нужно только написать один, если:
IntPtr
), и вы не можете использовать SafeHandle
, что упрощает егоIDisposable
в классе, который не запечатан. (Мое предпочтение заключается в том, чтобы запечатывать классы, если они не предназначены для наследования.) Финализатор является частью канонического шаблона Dispose в таких случаях.Он используется для указания деструктора для класса.
То же, что и С++, это деструктор; однако в С# вы не вызываете его явно, он вызывается, когда объект собирается.
См. Деструкторы (Руководство по программированию на С#). Имейте в виду, однако, что, в отличие от С++, программист не имеет никакого контроля над вызовом деструктора, потому что это определяется сборщиком мусора.
~ обычно представляет собой деконструктор. который запускается прямо перед тем, как объект умирает.
Одна точка в Finalizer выше, в ситуации, которая вам может понадобиться назвать. Вам нужно, чтобы они освобождали неуправляемые ресурсы, которые более распространены, чем вы думаете, обычно для баз данных. SQLConnection - пример, по которому вы всегда должны вызывать Dispose(), когда вы закончите с ним.
Одна статья: http://www.codeproject.com/KB/cs/idisposable.aspx