Некоторые ключи из книги MCSD Certification Toolkit (экзамен 70-483) стр. 193:
деструктор ≈ (он почти равен) base.Finalize () , деструктор преобразуется в переопределенную версию метода Finalize, которая выполняет код деструктора и затем вызывает метод Finalize базового класса. Тогда это полностью недетерминированный, вы не можете знать, когда будет вызван, потому что зависит от GC.
Если класс не содержит управляемых ресурсов и неуправляемых ресурсов , ему не нужно
У реализации IDisposableor есть деструктор.
Если класс имеет только управляемые ресурсы , он должен реализовывать IDisposable, но это не так
нужен деструктор. (Когда деструктор запускается, вы не можете быть уверены, что управляемые объекты по-прежнему
существует, так что вы все равно не можете вызывать их методы Dispose.)
Если класс имеет только неуправляемые ресурсы , он должен реализовать IDisposable и нуждается в
деструктор, если программа не вызывает Dispose.
Метод Dispose должен быть безопасным для запуска более одного раза. Вы можете достичь этого с помощью
переменная для отслеживания того, был ли он запущен ранее.
Метод Dispose должен освободить как управляемые, так и неуправляемые ресурсы .
Деструктор должен освобождать только неуправляемые ресурсы . (Когда деструктор выполняется, вы
Вы не можете быть уверены, что управляемые объекты все еще существуют, поэтому вы все равно не можете вызывать их методы Dispose.)
После освобождения ресурсов деструктор должен вызвать GC.SuppressFinalize , чтобы объект мог
пропустить очередь завершения.
Пример реализации для класса с неуправляемыми и управляемыми ресурсами:
using System;
class DisposableClass : IDisposable
{
// A name to keep track of the object.
public string Name = "";
// Free managed and unmanaged resources.
public void Dispose()
{
FreeResources(true);
}
// Destructor to clean up unmanaged resources
// but not managed resources.
~DisposableClass()
{
FreeResources(false);
}
// Keep track if whether resources are already freed.
private bool ResourcesAreFreed = false;
// Free resources.
private void FreeResources(bool freeManagedResources)
{
Console.WriteLine(Name + ": FreeResources");
if (!ResourcesAreFreed)
{
// Dispose of managed resources if appropriate.
if (freeManagedResources)
{
// Dispose of managed resources here.
Console.WriteLine(Name + ": Dispose of managed resources");
}
// Dispose of unmanaged resources here.
Console.WriteLine(Name + ": Dispose of unmanaged resources");
// Remember that we have disposed of resources.
ResourcesAreFreed = true;
// We don't need the destructor because
// our resources are already freed.
GC.SuppressFinalize(this);
}
}
}