我想知道为什么原语不可为空。
今天我看了this
null关键字是一个表示空引用的文字,一个不引用任何对象的引用。 null是引用类型变量的默认值。普通值类型不能为空。但是,C#2.0引入了可空值类型。请参阅可空类型(C#编程指南)。
所以我知道C#中的int?
或Java中的Integer
都有可空的原语,但为什么不是int或bool等直接可以为空?
这个问题并不针对任何编程语言,但编程语言中存在差异,为什么它们不允许原语为空?
答案 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 ;