Ниже приводится типичный пример отчуждать картину:Зачем вызывать dispose (false) в деструкторе?
public bool IsDisposed { get; private set; }
#region IDisposable Members
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!IsDisposed)
{
if (disposing)
{
//perform cleanup here
}
IsDisposed = true;
}
}
~MyObject()
{
Dispose(false);
}
Я понимаю, что распоряжаться делает, но то, что я не понимаю, почему вы хотите звонить распоряжаться (ложь) в деструкторе? Если вы посмотрите на определение, оно ничего не сделает, так зачем же писать такой код? Разве это не имело бы смысла только не Выйти из деструктора вообще?
Но обратите внимание, что если у вас нет неуправляемых ресурсов, тогда 'Dispose (false)' не имеет ничего общего, поэтому вам не нужен финализатор или 'Dispose (bool)' вообще. Я чувствую, что стандартная модель слишком сложна, чтобы обслуживать случаи использования, которые почти никогда не бывают (и когда они делают это, вероятно, плохая идея). Вот что я предпочитаю: http://nitoprograms.blogspot.com/2009/08/how-to-implement-idisposable-and.html –
@romkyns «Основное использование [IDisposable] - освобождение неуправляемых ресурсов». (http://msdn.microsoft.com/en-us/library/System.IDisposable.aspx). Поэтому неудивительно, что стандартный способ реализации IDisposable - это больше, чем вам нужно, если у вас нет неуправляемых ресурсов. Я не уверен, что вы подразумеваете под «случаями использования, которые почти никогда не встречаются» - наличие смешанных управляемых и неуправляемых ресурсов не является неясным вариантом использования. –
Тем не менее, я согласен, что если финализатор ничего не делает (потому что у вас нет неуправляемых ресурсов), вам это не нужно. Как и большинство моделей (как и большинство других, я думаю), имеет смысл использовать его там, где это имеет смысл. ;) –