gpt4 book ai didi

c# - 什么是统一类型系统?

转载 作者:太空狗 更新时间:2023-10-29 22:49:15 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

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

同时,Java 也有面向对象的原始“包装”类型(Integer、Long、Double、Byte 等),通常称为boxed类型。这些是通过引用传递的堆分配对象,并且与上述基本类型并行存在。

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

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

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

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

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

关于c# - 什么是统一类型系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com