Петли и сборка мусора - PullRequest
       12

Петли и сборка мусора

4 голосов
/ 06 октября 2008

Я работаю над веб-приложением и столкнулся со следующей ситуацией.

Dim a as Object
Dim i as Integer = 0

Try

    For i=1 to 5

        a = new Object()

        'Do stuff '

        a = Nothing

    Next

Catch

Finally

   a = Nothing

End Try

Нужно ли делать a = ничего в цикле или сборщик мусора очистит a?

Ответы [ 5 ]

12 голосов
/ 06 октября 2008

В .NET обычно не требуется для задания ссылки на переменную = Nothing (null в C #). Сборщик мусора будет убирать, в конце концов. Сама ссылка будет уничтожена, когда она выйдет из области видимости (либо когда ваш метод завершится, либо когда объект этого класса будет завершен). Обратите внимание, что это не означает, что объект уничтожен, просто ссылка к этому. Объект все еще будет недетерминированно уничтожен коллектором.

Тем не менее, установка вашей ссылки = Nothing даст подсказку .NET, что объект может быть мусором и не обязательно повредит чему-либо - кроме беспорядка кода. Если бы вы держали его там, я бы порекомендовал удалить его из блока Try; он уже находится в блоке Finally и поэтому будет вызываться всегда. (За исключением некоторых катастрофических исключений; но в этих случаях он также не вызывался бы в блоке Try!)

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

Dim a as Object
Dim i as Integer = 0

For i=1 to 5
    a = new Object()
    'Do stuff
Next
5 голосов
/ 06 октября 2008

Почти никогда не требуется явно присваивать Nothing переменной. Задача сборщика мусора состоит в том, чтобы позаботиться о распределении памяти для вас, в частности, чтобы избавить вас от этой ответственности. Так что нет, вам не нужно присваивать a = Nothing внутри цикла.

Вам также не нужен блок try/finally, который ничего не назначает всему объекту. Это действительно просто дополнительный беспорядок, который система поддержки позаботится в любом случае.

2 голосов
/ 06 октября 2008

Нет, тебе это не нужно. .NET имеет сборку мусора. И поскольку похоже, что этот код находится в области действия метода, сборщик мусора очистит все локальные переменные.

0 голосов
/ 06 октября 2008

Как и все, что было сказано выше, вам не нужно явно устанавливать ваши переменные в ноль, так как это обрабатывается автоматически. Однако, если по какой-либо причине вы хотите заставить GC собирать данные, вы можете выполнить это:

System.GC.Collect()
0 голосов
/ 06 октября 2008

ГХ очистит его.

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