Лучше уничтожить все объекты или просто позволить сборщику мусора выполнить свою работу? - PullRequest
2 голосов
/ 04 декабря 2010

У меня есть функция, подобная следующей:

Public Function testFunction(ByVal input_string As String) As String

    Dim s As New StringBuilder()
    Dim c As Char
    For i As Integer = 0 To input_string.Length - 1
        c = input_string.Chars(i)
        s.Append(c)
    Next
    Return s.ToString

End Function

, но я хочу знать, лучше ли явно уничтожить какой-либо объект, например так:

    Public Function testFunction(ByVal input_string As String) As String

    Dim s As New StringBuilder()
    Dim c As Char
    For i As Integer = 0 To input_string.Length - 1
        c = input_string.Chars(i)
        s.Append(c)
    Next

    Dim t As String = s.ToString
    s = Nothing

    Return t

End Function

или просто пустить мусорКоллектор делает работу за нас?

Обе вышеупомянутые функции работают, но я хочу знать только лучшие практики для производительности ...

спасибо

Ответы [ 6 ]

6 голосов
/ 04 декабря 2010

Установка s = Nothing не имеет смысла, так как она выпадает из области видимости при следующей инструкции, таким образом, в любом случае она становится пригодной для сбора мусора.

Установка переменной на ноль / ничто не означает, что в этот момент начинается сборка мусора.

4 голосов
/ 04 декабря 2010

Это всегда лучше позволить сборщику мусора выполнить эту работу за вас. Подумайте об этом так: программист, намного умнее вас (и меня), тщательно оптимизировал сборку мусорарутина, чтобы сделать жизнь намного проще и безболезненнее для вас.Маловероятно, что мы сможем сделать лучше сами и, скорее всего, просто вмешаемся.

По сути, объекты, которые создаются как локальные переменные, станут пригодными для сборки мусора, как только они выпадут из области видимости(т. е. этот метод завершает выполнение).Ваш StringBuilder объект будет собираться мусором всякий раз, когда запускается сборщик мусора (это еще одна вещь, о которой вам не нужно беспокоиться - невозможно знать, когда в следующий раз будет работать GC).

Установка объекта на Nothing буквально ничего не делает (обратите внимание, что это отличается от версий Visual Basic до .NET).Как правило, он будет оптимизирован компилятором в режиме Release, и даже если это не так, он вам не поможет.

Однако, если объект имеет Dispose метод , вы должны его вызывать.Или еще лучше, оберните это в Using заявление .Но все еще нет причин устанавливать ссылку на Nothing.

1 голос
/ 04 декабря 2010

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

Если объект реализует IDisposble вы must call .Dispose() - если вы не используете его, вы используете его неправильно.Объект может попытаться защитить вас от себя и вызвать Dispose сам, когда он завершается (уничтожается, освобождается), но объектам не требуется для выполнения вашей работы за вас.

См. Также

0 голосов
/ 04 декабря 2010

Смысл сбора мусора в том, что вам больше не нужно вручную управлять памятью. Пусть сборщик мусора сделает свое дело.

Кроме того, установка переменной на Nothing не означает, что GC собирается запустить и освободить память; GC является недетерминированным. Он мог работать сразу, он мог работать за четыре и семь лет.

0 голосов
/ 04 декабря 2010

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

0 голосов
/ 04 декабря 2010

Пусть сборщик мусора сделает это.Классы, которые реализуют интерфейс IDisposable, предназначены для управления сборщиком мусора, т. Е. Вы вызываете object.Dispose ().Это связано с тем, что эти классы используют ограниченные системные ресурсы, такие как дескрипторы файлов и кисти GDI.Если он не реализует IDisposable, то обычно безопасно просто позволить сборщику мусора обработать его.

...