Установка объектов в ноль / ничего после использования в .NET - PullRequest
178 голосов
/ 06 августа 2008

Должны ли вы установить для всех объектов значение null (Nothing в VB.NET), как только закончите с ними?

Я понимаю, что в .NET важно избавиться от любых экземпляров объектов, которые реализуют интерфейс IDisposable, чтобы высвободить некоторые ресурсы, хотя объект может все еще быть чем-то после его удаления (следовательно, свойство isDisposed в формах ), поэтому я предполагаю, что он все еще может находиться в памяти или хотя бы частично?

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

Итак, учитывая это, установит ли он значение null, чтобы ускорить высвобождение памяти системой, поскольку ей не нужно выяснять, что она больше не находится в области видимости и являются ли они плохими побочными эффектами?

Статьи MSDN никогда не делают этого в примерах, и в настоящее время я делаю это, так как не могу увидеть вред. Однако я натолкнулся на смесь мнений, поэтому любые комментарии полезны.

Ответы [ 14 ]

1 голос
/ 17 августа 2008

Взгляните и на эту статью: http://www.codeproject.com/KB/cs/idisposable.aspx

По большей части установка нулевого объекта не имеет никакого эффекта. Единственный раз, когда вы должны быть уверены, это если вы работаете с «крупным объектом», размер которого превышает 84 КБ (например, растровых изображений).

1 голос
/ 06 августа 2008

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

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

В целом, вам действительно не стоит беспокоиться. Пусть компилятор и GC выполнят свою работу, чтобы вы могли выполнять свою.

0 голосов
/ 10 мая 2016

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

Лично я часто в явном виде устанавливаю переменные в null, когда заканчиваю с ними как форму самодокументирования. Я не объявляю, использую, затем устанавливаю на нуль позже - я обнуляю сразу после того, как они больше не нужны. Я говорю прямо: «Я официально закончил с тобой ... уйду ...»

Нужно ли обнулять в языке GC'd? Нет. Это полезно для GC? Может быть, да, может, нет, не знаю наверняка, по своей структуре я действительно не могу это контролировать, и независимо от сегодняшнего ответа с этой версией или той, будущие реализации GC могут изменить ответ вне моего контроля. Плюс, если / когда обнуление оптимизировано, это немного больше, чем фантастический комментарий , если хотите.

Я полагаю, если это прояснит мои намерения следующему бедному дураку, который пойдет по моим стопам, и если это "может" потенциально помочь ГК иногда, то это того стоит для меня. В основном это заставляет меня чувствовать себя опрятным и ясным, а Монго любит чувствовать себя опрятным и чистым. :)

Я смотрю на это так: языки программирования существуют, чтобы позволить людям дать другим людям представление о намерениях, а компилятор запросить работу, что делать - компилятор преобразует этот запрос в другой язык (иногда несколько) для CPU - CPU (ы) могут дать подсказку, какой язык вы использовали, настройки вкладок, комментарии, стилистические акценты, имена переменных и т. Д. - CPU - все о битовом потоке, который сообщает ему, какие регистры и коды операций и места в памяти вертеть Многие вещи, написанные в коде, не преобразуются в то, что потребляется процессором в указанной нами последовательности. Наш C, C ++, C #, Lisp, Babel, ассемблер или что-то еще является теорией, а не реальностью, написанной как констатация работы. То, что вы видите, не то, что вы получаете, да, даже на языке ассемблера.

Я понимаю, что мышление «ненужных вещей» (например, пустых строк) «не что иное, как шум и загромождение кода». Это был я ранее в моей карьере; Я полностью понимаю это. На этом этапе я склоняюсь к тому, что делает код более понятным. Это не то, что я добавляю даже 50 строк "шума" в мои программы - это несколько строк здесь или там.

Есть исключения из любого правила. В сценариях с энергозависимой памятью, статической памятью, состояниями гонки, одиночными событиями, использованием «устаревших» данных и всем этим видом гнили все по-другому: вам нужно управлять собственной памятью, блокируя и обнуляя как, кстати, потому что память не является частью Вселенная GC'd - надеюсь, все это понимают. В остальное время с языками GC это вопрос стиля, а не необходимости или гарантированного повышения производительности.

В конце дня убедитесь, что вы понимаете, что подходит для GC, а что нет; блокировать, распоряжаться и обнулять соответственно; воск, воск от; вдох-выдох; и для всего остального я говорю: если это хорошо, сделай это. Ваш пробег может меняться ... как следует ...

0 голосов
/ 06 августа 2008

Некоторые объекты предполагают метод .dispose(), который вынуждает ресурс быть удаленным из памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...