vb.net和c#的垃圾收集器有什么不同吗?

时间:2012-03-09 16:48:47

标签: c# .net vb.net garbage-collection

我听说c#垃圾收集器可能比它的vb.net对手更'积极'。这是真的?在vb.net和c#中如何运行垃圾收集还有其他差异吗?

5 个答案:

答案 0 :(得分:7)

我的理解是CLR维护垃圾收集并且不是特定于语言的。

答案 1 :(得分:6)

CLR中的垃圾收集器是相同的。人们所指的差异可能在于语言的语法。在VB.NET中,您可能会有一些语言结构导致对象的引用意外地挂起更长时间,从而导致对象在C#中尽早不符合GC条件。但这都是猜想。

答案 2 :(得分:5)

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

答案 3 :(得分:2)

C#或VB的垃圾收集器没有区别。这是CLR的一部分,并在所有语言中共享。但是, 在服务器上运行的垃圾收集器与工作站之间存在差异。

http://msdn.microsoft.com/en-us/library/ee787088.aspx#workstation_and_server_garbage_collection

答案 4 :(得分:1)

垃圾收集器本身是一样的。但是,终结者的处理方式有所不同。在vb.net中,只需声明Object.Finalize()即可覆盖Sub Overrides Finalize()。该例程中的任何代码都将覆盖Object.Finalize。在C#中,禁止覆盖Object.Finalize()。相反,必须使用一种语法结构,具有讽刺意味的是被称为"析构函数" (即使防止对象在其他情况下立即被销毁),也会覆盖Finalize()以下内容:

override void Finalize(void)
{
  try
  {
    .. supplied code here
  }
  finally
  {
    base.Finalize();
  }
}

语言构造的假设目的是使终结代码与平台无关。在实践中,它只是一个愚蠢的麻烦,因为任何使用终结器正确的代码都必须使用特定于平台的方法,如GC.KeepAlive()GC.SuppressFinalize()