摧毁所有对象或让垃圾收集器完成工作更好吗?

时间:2010-12-04 16:17:35

标签: .net vb.net memory-management garbage-collection

我有以下功能:

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 个答案:

答案 0 :(得分:6)

设置s = Nothing毫无意义,因为它在下一条指令的范围之外,因此无论如何都有资格进行垃圾收集。

将变量设置为null / nothing并不意味着垃圾收集会在此时启动。

答案 1 :(得分:4)

始终更好地让垃圾收集器为您完成工作。这样想一下:比您更聪明的程序员(和我)仔细优化了垃圾收集程序,让您的生活更简单,更轻松。我们不太可能自己做得更好,更有可能我们只是干涉。

基本上,实例化为局部变量的对象一旦超出范围就会有资格进行垃圾收集(即,该方法完成执行)。每当垃圾收集器运行时,您的StringBuilder对象将被垃圾收集(这是您不必担心的另一件事 - 下次GC运行时无法知道)。

将对象设置为Nothing字面上没有任何作用(请注意,这与Visual Basic的.NET之前的版本不同)。它通常会在发布模式下由编译器进行优化,即使不是,它也不会帮助你。

但是,如果某个对象有Dispose method,您应该调用它。或者更好的是,将其包裹在Using statement中。但仍然没有理由将其引用设置为Nothing

答案 2 :(得分:1)

如果某个对象没有实现IDisposable,那么你什么都不做是正确的(如果你愿意,你就无法释放该对象)。

如果某个对象实现了IDisposble,那么必须调用.Dispose() - 如果不这样做,则表示您使用了错误。该对象可以尝试保护您自己,并在最终确定(销毁,释放)时调用Dispose本身,但对象不是必需为您完成工作。

另见

答案 3 :(得分:0)

让垃圾收集器这样做。实现IDisposable接口的类旨在管理预垃圾收集器 - 这意味着您调用object.Dispose()。这是因为这些类使用有限的系统资源,如文件句柄和GDI画笔。如果它没有实现IDisposable,那么让垃圾收集器处理它通常是安全的。

答案 4 :(得分:0)

当代码结束函数时,所有对象都将被销毁,因为变量超出了范围。 s = Nothing是多余的,因为在下次运行GC时,无论如何都会销毁这些对象。

答案 5 :(得分:0)

垃圾收集的重点在于您不必再手动管理内存。让垃圾收集器完成它的工作。

此外,将变量设置为Nothing并不意味着GC将启动并释放内存; GC是不确定的。它可以立即运行,可以分四年和七年运行。