VB.NET和C#的垃圾回收器有什么区别吗?

5

我听说C#的垃圾回收器可以比它的VB.NET版本“更加积极”。这是真的吗?除了这个之外,在VB.NET和C#中垃圾回收运行的方式还有其他区别吗?


我希望没有任何区别,因为它是运行时CLR的事情,理论上CLR甚至不知道或关心程序是用什么语言编写的。当然现实可能会有很大的差异。 - MK.
谢谢,这也是我想的,但我听到这个说法已经很多次了,让我开始怀疑自己是否正确。 - Matthew Vines
5个回答

7
据我的了解,CLR负责垃圾回收的工作,它不依赖于特定语言。

6

CLR中的垃圾收集器是相同的。人们所指的差异可能在于语言的语法结构。在VB.NET中,您可能会有语言结构,导致对象引用意外地挂起更长时间,导致对象不能像在C#中那样尽早成为GC-eligible。不过,这只是猜测。


1
猜测,是的。但到目前为止仍然是最有可能的答案。 - H H

5
垃圾回收器是公共语言运行时(CLR)的一部分,提供跨所有使用CLR的语言的内存管理 - 它不是特定于某种语言的。

2

1
垃圾回收器本身是相同的。然而,在处理终结器方面有所不同。在vb.net中,通过简单地声明Sub Overrides Finalize()来覆盖Object.Finalize()。该程序中的任何代码都将覆盖Object.Finalize。在C#中,禁止覆盖Object.Finalize()。相反,必须使用一种语法结构,讽刺的是称为“析构函数”(即使它防止对象在本应立即被销毁时被销毁),它使用以下内容覆盖Finalize()
override void Finalize(void)
{
  try
  {
    .. supplied code here
  }
  finally
  {
    base.Finalize();
  }
}
该语言结构的目的是使终结器代码具有平台无关性。实际上,这只是一个愚蠢的麻烦,因为任何使用终结器的正确代码都必须使用特定于平台的方法,如GC.KeepAlive()GC.SuppressFinalize()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接