什么是统一类型系统?

2022-09-02 11:46:38

我读过C#和Java的比较,列表中的第一件事是“单根(统一)类型系统”。

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


答案 1

C#有一个统一的类型系统。所有 C# 类型(包括 int 和 double 等基元类型)都继承自单个根对象类型。与类对象不同,这些基元类型是值类型。它们不是单独堆分配的,而是按值传递的。

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

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

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

来源:C#和Java的比较 - 统一类型系统(维基百科)

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

在较新版本的 Java 中,基元类型会在必要时自动装箱到对象类型中。这减轻了管理它们的大部分负担,但它也可能导致微妙的错误(另请参阅自动装箱)。

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

这意味着你不能做一个Java,你只能做。而且,上面的列表实际上存储了一个指向盒装对象的指针数组,该数组的大小是 C# 版本的两倍,性能也大大降低。对于大多数用例,这种大小和性能的差异是无关紧要的。List<int>List<Integer>Integer

在大小和性能相关的用例中,有两个选项可用:

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

答案 2

实际上,C# 的情况并非如此,并非所有类型都派生自对象,就像 99.9% 的类型一样。有几种非常奇怪的类型无法变成物体。唯一官方支持的是指针。还有3个不受支持的,如TypedReference,RuntimeArgumentHandle和第三个名字逃脱了我的名字。这 3 种类型与 C++/C 中具有可变长度方法的互操作一起使用。我不会太担心他们。


推荐