什么是统一型系统?

时间:2010-11-20 14:09:50

标签: c# java type-systems

我读过一个comparison of C# and Java,列表中的第一件事是“单根(统一)类型系统”。

您能描述单根(统一)类型系统的含义吗?

2 个答案:

答案 0 :(得分:29)

C#具有统一的类型系统。 所有C#类型,包括基本类型,如int和double,从单个根object类型继承。与类对象不同,这些原始类型是值类型。它们不是单独堆分配的,而是按值传递的。

当C#值类型(例如基本int或用户定义的结构)放置在参数集合中时,它存储在没有指针的密集数组中。这是可能的,因为C#为所需的每个不同参数“大小”进行自定义参数实例化。这意味着当您实例化C#List<int>时,底层数组列表会存储密集的int数组。

来源:http://www.pin5i.com/showtopic-24376.html

Java 有几种原始类型(int,long,double,byte等) - 然而,它们的特殊之处在于它们不是对象 - 面向并且无法使用语言本身定义它们。它们是值类型,而不是堆分配,并按值传递。

来源:Comparison of C# and Java - Unified type system(维基百科)

同时, Java还具有面向对象的原始“包装器”类型(整数,长,双,字节等),通常称为boxed类型。这些是堆分配的对象,它们通过引用传递,并且与上面提到的基元类型并行存在。

在Java的更新版本中,基本类型会在必要时自动装入对象类型。这减轻了管理它们的大部分负担,但它也可能导致细微的错误(另见auto-boxing)。

与C#相反,在Java中,内置的JDK Collections框架始终管理对象指针的集合。为了使它们以向后兼容的方式进行参数化,Java执行一种称为类型擦除的技术,其中(在运行时)所有内容都被视为容器内的对象(参数化类型检查在编译时执行)。

这意味着您无法创建Java List<int>,您只能创建List<Integer>。并且,上面的列表实际上存储了一个指向盒装Integer对象的指针数组,这个对象的大小是C#版本的两倍,并且性能要低得多。对于大多数用例,这种尺寸和性能的差异是无关紧要的。

在尺寸和性能相关的使用案例中,有两种选择:

  1. 如果事先知道列表的大小,请使用本机类型数组,例如int[]。本机类型的数组被打包在内存中,因此它们消耗的内存更少,性能更高。
  2. 如果您事先不知道列表的大小,请使用包含本机数组的第三方列表实现,从而可以在创建后向其添加元素(例如:Trove,{{ 3}},ColtFastutil)。

答案 1 :(得分:12)

实际上,C#也不是这样,并非所有类型都来自对象,就像99.9%的对象一样。存在一些无法变成对象的非常奇怪的类型。 唯一官方支持的是指针。 还有3个不受支持的,比如TypedReference,RuntimeArgumentHandle和第三个名字让我失望的人。这三种类型与C ++ / C中的可变长度方法互操作一起使用。我不会太担心他们。