Глядя на шаблон IDisposable + шаблон Finalizer, я кое-что не понимаю:
public class ComplexCleanupBase : IDisposable
{
private bool disposed = false; // to detect redundant calls
public ComplexCleanupBase()
{
// allocate resources
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// dispose-only, i.e. non-finalizable logic
}
// shared cleanup logic
disposed = true;
}
}
~ComplexCleanupBase()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Насколько я понимаю, шаблон должен быть реализован, как указано выше.
1) Вызов Dispose () запускает GC.SuppressFinalize (this), что означает, что объект не следует помещать в очередь финализатора, поскольку он уже правильно удален? Это помогает быстрее освободить объект?
2) Но что, если я вообще не вызываю Dispose () для этого объекта? В этом случае должен сработать финализатор, верно? Но Dispose (ложь); абсолютно ничего не делает (только установка disposed = true). Это предназначено? Такое ощущение, что чего-то не хватает ...