为什么't原语不可为空?

本文关键字:原语 为什么 | 更新日期: 2023-09-27 18:17:32

我想知道为什么原语不能为空。

今天我读了这个

null关键字是一个表示空引用的字面值,它不引用任何对象。Null是引用类型变量的默认值。普通值类型不能为空。然而,c# 2.0引入了可空值类型。参见可空类型(c#编程指南)

所以我知道有可空的原语,比如c#中的int?或Java中的Integer,但为什么int或bool等不是直接可空的呢?

这个问题不是针对任何编程语言的,但是编程语言之间是否存在差异,为什么它们不允许原语为空?

为什么't原语不可为空?

我试着用c++来解释:

在c++中,整型、boolean、…都是直接赋值给内存的,所以如果你创建一个整型变量,它只使用四个字节作为值。如果你想创建一个可空的整型变量,你必须创建一个指向存储该值的内存的指针,所以如果指针为空(0x0),它就不指向任何东西。如果不为空,则指向该整数的实值。

如果你想把两个整数相加,你可以用一条汇编指令来完成,因为这些值可以直接传递给处理器。

可以转换为c#/Java的字节码。这些原语可以被c#/java虚拟机直接使用。所有其他变量都不能直接使用,它们必须由编译器"解引用"。

null指向什么都没有,所以它是一个(不存在的)引用。在Java中,Object是一个引用类型,因此对象类型的值可以保存空值(例如:Integer)。另一方面,原语是值类型而不是引用类型,因此它们不能是null

出于性能考虑,Java是这样设计的。
使用引用比使用值更慢,更消耗内存。

如你所引述

null关键字是一个表示空引用的字面值,它不引用任何对象。Null是引用类型变量的默认值。

与object不同,原语包含数据,而不是引用。因为原语没有机会保存引用,所以null对它们来说没有意义。

因为它们不能保存空值它们不是对象只有对象可以保存空值它们拥有自己的默认值的基本类型例如:
char持有''u0000'作为其默认值,但如果你想使用一个空值,你应该使用字符类,而不是单个字符实例的容器…:)我希望这对你有帮助

值类型是结构体,它们只能保存值。例如,c#中的Int存储1、2等等。不能通过创建对象来引用它们。

当它被认为是字符串或任何类时…他们可以参考。如果它是null,意味着没有引用任何东西。

最后我想说,值类型存储值,对象存储值的引用:)

因为类型如int, bool等都是值类型,它们在初始化后必须有一些值。

在c#中,如果你像这样初始化int(不赋值):

int someInt;

默认值为0。该变量必须有一个特定的值。

引用类型中,如string或object的实例:

string someString;
SomeClass someObject;

默认赋值null;