В C# вам не нужно напрямую использовать финализатор. Он вызывается G C для очистки только неуправляемых ресурсов, если таковые имеются. Технически финализуемый объект добавляется в отдельную очередь и завершается в отдельном потоке перед сборкой мусора. Тем не менее, это базовый поток c, и вам не нужно полагаться на него.
Eri c Липперт написал две очень хорошие статьи о финализаторах под капотом: это и это , обратитесь к ним, чтобы увидеть возможные подводные камни здесь. Финализаторы вызываются в недетерминированном порядке c, вы никогда не должны выполнять какие-либо логические операции c зависит от других объектов внутри финализатора.
Для ваших целей вы можете реализовать интерфейс IDisposable
и очистить ресурсы явно посмотрите MSDN guide для подробностей.
Очень простой пример приведен ниже
public class MyResource : IDisposable
{
// managed resource this class uses.
private readonly Component _component = new Component();
private bool _disposed;
public void Dispose()
{
if (!_disposed)
{
// Dispose managed resources.
_component.Dispose();
_disposed = true;
}
//tell CLR to prevent finalization, since it's already done
GC.SuppressFinalize(this);
}
}
Если ваш класс использует только управляемые ресурсы, вам не нужно использовать финализатор, вы просто реализуете метод Dispose()
для очистки управляемые ресурсы.
Объект, реализующий IDisposable
, может использоваться в операторе using
или в блоке try/finally
в соответствии с с использованием объекта, реализующего IDisposable