Проверяет знание шаблона очистки неуправляемых ресурсов в .NET.
IDisposable реализуют классы, владеющие неуправляемыми ресурсами (файлы, сокеты). Метод Dispose() вызывается вручную или через using для немедленного освобождения. Finalize (деструктор) запускается GC при сборке, если Dispose не был вызван, но не гарантирует время выполнения. Реализация часто сочетает оба: в finalizer’е вызывают Dispose(false), а в Dispose() — GC.SuppressFinalize(this).
Dispose Pattern:
public class ResourceHolder : IDisposable {
private bool _disposed;
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }
protected virtual void Dispose(bool disposing) {
if (!_disposed) {
if (disposing) {
// освобождаем управляемые ресурсы
}
// освобождаем неуправляемые ресурсы
_disposed = true;
}
}
~ResourceHolder() { Dispose(false); }
}Dispose():
Освобождает ресурсы сразу, вызывается явно или через using.
Finalize:
Вызывается финализатором GC, если не вызван Dispose.
Работает неопределённо поздно, дорогостоящая операция.
Вывод:
Используйте using и Dispose для предсказуемого освобождения; finalizer — страховка.