C#
有一个统一的类型系统,其中所有类型,包括原始类型都继承自object
类型。
Java
的所有类都继承自object
类型。
来自Thinking in java
单根的层次结构使得实现垃圾变得更加容易 集电极
是否,unified type system
或single rooted hierarchy
有助于垃圾收集,如果是,如何?
答案 0 :(得分:1)
我认为主要原因是它有助于确保所有对象都具有Finalize
方法,从而实现与GC的自动兼容。
在对象变得不可访问之后,将自动调用此方法,除非通过调用GC.SuppressFinalize来豁免对象的最终确定。在关闭应用程序域期间,会自动调用Finalize,这些对象不会被终止,即使是那些仍然可访问的对象。 Finalize在给定实例上仅自动调用一次,除非使用诸如GC.ReRegisterForFinalize和GC.SuppressFinalize之类的机制重新注册该对象。
答案 1 :(得分:1)
嗯,你有一个问题 - 你认为它有帮助,因为它使垃圾收集器更好。
IT有帮助,因为它可以避免(!)垃圾收集。
结构在C#中 - 这些都是像int等原始类型,但也是你自己创建的所有类型 - 不是垃圾收集,除非它们被装箱(分配给一个对象,然后它们得到一个包装器)。
这意味着我可以将像Point这样的元素(x和y作为整数)在垃圾收集器中具有零开销,因为它不是垃圾收集。
基本上,在Java原语中是“编译器黑客”,在C#原语中是“对象层次结构的另一面”,它们是结构,而不是类。
因此,统一类型系统无法通过统一来帮助gargabe收集器,因为它不会创建首先被垃圾收集的对象。
这也带来了通用支持 - 高效的集合,无需每个项目。这就是Java中令人讨厌的地方,因为运行时没有Bytecode Level的泛型概念,因此所有内容都是“对象”,而在C#中,List是Bytecode中的一个单独的List类型并进行了优化。
答案 2 :(得分:1)
垃圾收集器唯一需要的是能够识别对象的大小以及对象中的引用(例如来自类型)
有一种方法可以确定这一点,可以使它更简单。
答案 3 :(得分:0)
.NET中统一的是定义结构类型和类类型的方法。结构定义
struct IntPair
{
public Int32 V1,V2;
}
定义了两件事。它定义了一个派生自IntPair
的堆对象类型IntPair
,Object
又派生自IntPair
,并且它的行为就像一个对象,因为它是一个。它还定义了一个存储位置类型Object
,其行为类似于用胶带粘在一起的一对整数,因为它是一对用胶带粘在一起的整数。虽然堆对象类型派生自{{1}},但存储位置类型不是一个对象,也不是一个对象。它有两个整数 - 仅此而已;没什么。
统一类型系统的好处是它使垃圾收集器更容易处理包含引用类型字段的值类型。 GC必须能够100%确定地识别整个Universe中存在的所有可到达引用,包括那些是值类型字段的引用。如果类类型和值类型定义使用相同的数据结构,则用于确定类对象的大小和每个字段的偏移的过程也可用于确定结构的大小以及其每个嵌套字段的偏移量。 。拥有不会包含嵌套引用的值类型使用相同的数据结构并不会使GC特别受益,但也不会伤害任何内容。鉴于包含引用的值类型需要以GC所知的方式定义,所以通过相同的方式定义所有值类型比使用一种方式定义的引用更容易,以及那些以及#39; t包含另一个定义的引用。