我有以下功能:
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
或者让垃圾收集器为我们完成工作?
上述两个功能都有效,但我只想知道最佳性能...
谢谢
答案 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是不确定的。它可以立即运行,可以分四年和七年运行。