为什么基元不能为空
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;
我想知道为什么原语不可为空。
今天我读了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;