Присваивает ли присвоение Nothing команду Dispose? - PullRequest
2 голосов
/ 21 июля 2009

Я недавно видел некоторый код VB .NET следующим образом:

Dim service = ...
Try
   ...
   service.Close()
Finally
   service = Nothing
End Try

Назначает ли сервис Nothing ничего? Если это проблема сбора мусора, я предполагаю, что когда «служба» выйдет из области видимости, объект, на который имеется ссылка, будет подвергнут сборке мусора и вызову метода dispose для объекта.

Мне кажется, что присвоение этой переменной Nothing ничего не может поделать, поскольку может существовать другая ссылка на окружающий объект, так что ссылка в любом случае должна быть проверена.

Ответы [ 7 ]

4 голосов
/ 21 июля 2009

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

3 голосов
/ 21 июля 2009

NO !

Вы видите старый код VB6, где присвоение Nothing уменьшало количество ссылок на COM-объекты.

2 голосов
/ 21 июля 2009

В большинстве случаев назначение нуля (Nothing) для ссылки не имеет никакого значения для сборки мусора, чем когда-либо.

Сборщик мусора не заботится о сфере действия, он заботится только об использовании. После точки в коде, где объект используется в последний раз, сборщик мусора знает, что он может собрать его, потому что он больше не будет использоваться.

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

(хотя в режиме отладки использование переменной расширено до ее области видимости, так что отладчик может отображать значение переменной во всей области видимости.)

1 голос
/ 21 июля 2009

Как уже все говорили, установка на ничто не приводит к принудительному сбору мусора, если вы хотите использовать GC, то вам лучше использовать слово ke *

.
   Using objA As A = New A()
       objA.DoSomething()
   End Using

Вам по-прежнему не нужно устанавливать ничего, так как End Using сообщает сборщику мусора, что объект больше не используется

1 голос
/ 21 июля 2009

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

Мне нравится назначать NULL в любом случае, чтобы явно заявить, что я больше не буду использовать этот другой объект. Так что это гораздо больше связано с обнаружением ошибок (вы получите исключение nullreference вместо того, чтобы, возможно, вызывать какой-то другой объект - что может привести к сбою или даже создать некоторые побочные эффекты в молчании).

Таким образом, присвоение NULL после закрытия другого объекта (File или чего-либо еще) - это «чистота кода», которая облегчает отладку, это не помощь сборщику мусора (за исключением некоторых действительно странных угловых случаев - но когда вам нужно позаботиться о что вы узнаете о сборщике мусора больше, чем когда-либо хотели ...)

0 голосов
/ 13 декабря 2012

В .net (или Java) важно понимать, что переменная, поле или другое хранилище типа класса Foo не содержит Foo. Он содержит ссылку на Foo. Аналогично, List<Foo> не содержит Foo с; он содержит ссылки на Foo с. Во многих случаях программисту известно, что переменная содержит единственную существующую ссылку на какой-то конкретный Foo. К сожалению, у компилятора нет общих средств узнать, содержит ли место хранения единственную существующую ссылку на объект, или содержит один из многих.

Основное правило о IDisposable состоит в том, что объектам, которые реализуют IDisposable, следует сказать, что они больше не нужны, когда-то между моментом, когда они фактически больше не нужны, и временем, когда все ссылки на них оставлены. Если объект не был Dispose d, и код собирается перезаписать единственную существующую ссылку на него (либо путем сохранения null, либо путем сохранения ссылки на что-то еще), объект должен иметь Dispose метод называется. Если существует другая ссылка на объект, и владельцы этих ссылок ожидают, что продолжат использовать его, Dispose вызывать не следует. Поскольку компилятор не может сказать, какая ситуация применима, он не вызывает Dispose, но оставляет это для программиста (который, мы надеемся, лучше знает, вызывать его или нет).

0 голосов
/ 21 июля 2009

Похоже, ответ лежит в ответе на этот пост: Циклы и сборка мусора

...