为什么不是原始的可空

时间:2015-10-14 09:31:45

标签: java c# null nullable

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

今天我看了this

  

null关键字是一个表示空引用的文字,一个不引用任何对象的引用。 null是引用类型变量的默认值。普通值类型不能为空。但是,C#2.0引入了可空值类型。请参阅可空类型(C#编程指南)。

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

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

6 个答案:

答案 0 :(得分:6)

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

出于性能考虑,Java已经采用这种方式设计。与使用值相比,使用引用更慢,占用内存更多。

答案 1 :(得分:5)

我尝试用C ++解释它:

在C ++中,整数,布尔值,...直接分配给内存,因此如果创建一个整数变量,它只使用该值的四个字节。如果要创建可为空的整数变量,则必须创建指向存储该值的内存的指针,因此如果指针为空(0x0),则它指向任何内容。如果它不为null,则指向整数的实际值。

如果要添加两个整数,可以使用单个汇编程序指令来完成,因为这些值可以直接传递给处理器。

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

答案 2 :(得分:4)

正如你引用的那样

  

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

当它被认为是字符串或任何类......它们可以被引用。如果它具有null意味着不引用任何东西..

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

答案 5 :(得分:0)

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

在C#中,如果你像这样初始化int(没有赋值):

int someInt;
默认情况下,

指定值0.变量必须具有特定值。

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

string someString;
SomeClass someObject;
默认情况下,

指定为 null ;