Почему делают мы должны Расположить () метод на некотором объекте? Почему сборщик "мусора" не делает этой работы?

Вопрос: почему мы должны звонить Dispose() на некоторых объектах? Почему сборщик "мусора" не собирает объект, когда он выходит из объема? Я пытаюсь понять причину, почему она была реализована как этот. Я имею в виду, не был бы это быть легче если Dispose() был назван, когда сборщик "мусора", собранный из объема, возражает.

11
задан 101100 25 July 2011 в 17:08
поделиться

2 ответа

Сборщик мусора не детерминирован - он собирает объекты в какой-то точке после того, как на них больше нет ссылок, но это не гарантированно произойдет вовремя. Это имеет различные преимущества по сравнению с подсчётом ссылок, включая возможность циклических зависимостей и преимущество производительности от того, что счетчики не инкрементируют и не декрементируют везде.

Однако, это означает, что для ресурсов, которые должны быть своевременно очищены (такие как соединения с базами данных, файловые дескрипторы и т.д. - практически все, что угодно, кроме памяти), вам все равно нужно явно распоряжаться ресурсом. Однако утверждение using делает это довольно простым.

.
22
ответ дан 3 December 2019 в 03:04
поделиться

Диспозиция используется для очистки неуправляемых ресурсов (например, обёртки для подключений к базам данных, старые 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

7
ответ дан 3 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: