Вопрос: почему мы должны звонить Dispose()
на некоторых объектах? Почему сборщик "мусора" не собирает объект, когда он выходит из объема? Я пытаюсь понять причину, почему она была реализована как этот. Я имею в виду, не был бы это быть легче если Dispose()
был назван, когда сборщик "мусора", собранный из объема, возражает.
Сборщик мусора не детерминирован - он собирает объекты в какой-то точке после того, как на них больше нет ссылок, но это не гарантированно произойдет вовремя. Это имеет различные преимущества по сравнению с подсчётом ссылок, включая возможность циклических зависимостей и преимущество производительности от того, что счетчики не инкрементируют и не декрементируют везде.
Однако, это означает, что для ресурсов, которые должны быть своевременно очищены (такие как соединения с базами данных, файловые дескрипторы и т.д. - практически все, что угодно, кроме памяти), вам все равно нужно явно распоряжаться ресурсом. Однако утверждение using
делает это довольно простым.
Диспозиция используется для очистки неуправляемых ресурсов (например, обёртки для подключений к базам данных, старые COM-библиотеки, ...).
Правка:.
Некоторые ссылки MSDN с более подробной информацией:
http://msdn.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx
http://msdn.microsoft.com/en-us/library/0xy59wtx(VS.71).aspx
Чтобы указать, что происходит с неуправляемыми ресурсами, когда сборщик мусора восстанавливает объект, вы должны переопределить защищенный метод Finalize(): http://msdn.microsoft.com/en-us/library/system.object.finalize(VS.71).aspx