我听说c#垃圾收集器可能比它的vb.net对手更'积极'。这是真的?在vb.net和c#中如何运行垃圾收集还有其他差异吗?
答案 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()
。