为什么基元不能为空

why aren't primitives nullable

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

今天我读了this

The null keyword is a literal that represents a null reference, one that does not refer to any object. null is the default value of reference-type variables. Ordinary value types cannot be null. However, C# 2.0 introduced nullable value types. See Nullable Types (C# Programming Guide).

所以我知道有像 C# 中的 int? 或 Java 中的 Integer 这样的可空原语,但为什么 int 或 bool 等不能直接为空?

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

我试着用C++来解释它:

在 C++ 中,整数、布尔值……直接分配给内存,因此如果您创建一个整数变量,它只使用四个字节作为值。如果你想创建一个可为空的整数变量,你必须创建一个指向存储值的内存的指针,所以如果指针为空 (0x0),它什么都不指向。如果它不为空,则它指向整数的实际值。

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

这个可以转成C#的字节码/Java。 C#/Java-Virtual Machine 可以直接使用原语。所有其他变量都不能直接使用,必须由编译器“取消引用”。

因为它们不能保存空值,所以它们不是对象,只有对象可以保存空值,因为它们拥有自己的默认值,例如:
char 将 '\u0000' 作为其默认值,但如果您想使用空值,则应使用 Character Class 而不是单个 char 实例的容器。 .. :) 我希望这会对你有所帮助:)

如你所言

The null keyword is a literal that represents a null reference, one that does not refer to any object. null is the default value of reference-type variables.

与对象原语不同,原语保存数据,而不是引用。由于基元没有机会在其中保存引用,因此 null 对它们没有任何意义。

值类型是结构。它们只能容纳 values.For 在 C# 中存储 1,2 的示例 Int,因此 on.We 不能通过创建对象来引用它们。

当它被认为是字符串或任何 class...它们可以是 referred.If 它具有 null 意味着不引用任何东西..

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

null 没有指向 任何内容,因此它是一个(不存在的)引用。在 Java 中,Object 是引用类型,因此对象类型值可以包含空值(例如 Integer)。另一方面,基元是值类型而不是引用类型,因此它们不能是 null.

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

因为 int、bool 等类型是 值类型 并且它们在初始化后必须具有一些值。

在 C# 中,如果您像这样初始化 int(不分配任何值):

int someInt;

默认赋值0。变量必须有特定值。

引用类型中,例如字符串或对象实例:

string someString;
SomeClass someObject;

默认赋值null;