Использование деструктора в C #? - PullRequest
7 голосов
/ 06 сентября 2010

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

Ответы [ 6 ]

14 голосов
/ 06 сентября 2010

Все думают о сборе мусора неправильно :

Правильно написанная программа не может Предположим, что финализаторы когда-либо будут работать.

3 голосов
/ 06 сентября 2010

Было бы также полезно прочитать о правильном способе реализации шаблона IDisposable.Это гораздо больше, чем мы думаем -

http://msdn.microsoft.com/en-us/magazine/cc163392.aspx

3 голосов
/ 06 сентября 2010

Я думаю, что, прочитав вашу почти повторяющуюся тему , вы не совсем понимаете, как работает сборщик мусора. Вкратце, это его собственная служба, работающая в фоновом режиме, которая отслеживает и освобождает память для неиспользуемых и удаленных объектов в течение всего срока службы вашего приложения. Реально, вы никогда не должны звонить в ГК самостоятельно, если только в очень редких и особых случаях.

Деструкторы используются для очистки и освобождения неуправляемых ресурсов, которые не могут быть освобождены сборщиком мусора , для получения дополнительной информации о деструкторах см. Эту страницу MSDN .

2 голосов
/ 06 сентября 2010

Деструктор не предназначен для очистки управляемой памяти. Вот для чего предназначен сборщик мусора. Деструктор предназначен для очистки других ресурсов, таких как ручки.

Я рекомендую вам взглянуть на CLR через C # , чтобы узнать, как это работает.

1 голос
/ 06 сентября 2010

Я думаю, что путаница здесь возникает из-за того, что вы можете распоряжаться объектами как детерминистически, так и недетерминированно (т.е. когда GC приступает к этому).

Чтобы ответить на ваши вопросы о том, зачем нам вообще нужен GC, я бы сказал, даже не говоря о утечках памяти, что GC довольно производительны, а требование немедленного восстановления памяти может фактически снизить общую производительность системы. , Это аргумент, аналогичный многопоточным дебатам.

0 голосов
/ 31 января 2012

Деструкторы в C # должны использоваться очень редко.Однако в некоторых случаях у вас нет выбора.

Например, если у вас есть одноэлементный класс для ведения журнала и по причинам производительности вы не можете использовать автоматическую очистку, следует рассмотреть возможность очистки буфера во время финализации синглтона.*

...