Сначала на этой странице MSDN
есть стандартный шаблон Dispose. И есть bool в качестве параметра защищенного метода Dispose
, чтобы сообщить сборщику мусора, освобождены ли уже управляемые ресурсы вручную, чтобы сборщику мусора не нужно было о них заботиться.
Теперь вопрос, что именно нужно сделать внутри блока if (disposing) {}
? Обычно сборщик мусора очищает управляемые ресурсы, поэтому ничего особенного делать не нужно. Но поскольку внутри этого блока нужно явно очищать управляемые ресурсы, означает ли это, что нужно просто установить для всех полей и прочего в объекте значение null
?
Во-вторых, не лучше ли иметь в языке только один деструктор (или финализатор, как он там называется)? А потом в дизайне GC просто поставить бит, чтобы определить, вызван ли уже деструктор, чтобы не было необходимости собирать его мусором, или деструктор еще не вызван и GC должен его подчистить. Я нашел шаблон Dispose довольно сложным, и я очень запутался, что очищать в какой функции и как очищать в производных классах. И, используя схему деструктора signle, GC просто очищает вещи, когда они еще не очищены, и не очищает, когда они уже очищены.
Привет
PS: Значит, это также хороший и простой шаблон для очистки объектов?
class Foo
{
bool unmanagedDisposed = false;
void Dispose() {/*clean up unmanaged resources*/ unmanagedDisposed = true;}
~Foo() {if (!unmanagedDisposed) Dispose();}
}
Так что если программист знает и не забывает вызывать Dispose()
, то в финализаторе ничего не делать, иначе в финализаторе убирать неуправляемые ресурсы. И здесь нам не нужно заботиться об этих управляемых ресурсах.
IDisposable
. Как вы думаете, где вы должны вызватьDispose()
по этому поводу? - person Damien_The_Unbeliever   schedule 28.01.2013