2015-10-14 49 views
4

我想知道为什么基元不能为空。为什么不是基元可空

今天我读this

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

所以我知道有可空原语像在C#int?Integer Java编写,但为什么没有廉政局或布尔的直接等可空?

这个问题并不针对任何编程语言,但是编程语言中为什么不允许原语为空是不同的?

+0

由于性能cosideration.In C#nullables的是结构和在Java中包装类(整数)是引用类型。 –

+1

如果您不明白变量是什么以及CPU指令的C#语言抽象程度有多高,这是一个很好的问题。 – Sinatr

回答

4

我尝试用C++来explan它:

在C++中的整数,布尔......被直接分配到内存中,所以如果你创建它仅使用四个字节的值的整数变量。如果你想创建一个可为空的整数变量,你必须创建一个指向存储该值的内存的指针,所以如果指针为空(0x0),它将指向任何内容。如果它不为空,它指向整数的实际值。

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

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

0

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

+1

我认为OP是知道的,他问为什么 –

4

正如你引述

null关键字是表示nu的文字参考,不涉及任何对象。 null是引用类型变量的默认值。

不像对象原语持有数据,而不是引用。由于基元没有机会参与其中,所以null对它们没有任何意义。

0

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

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

最后,我想说的值类型存储值和对象存储值的参考:)

6

null价值什么都没有,所以这是一个(不存在)的参考。在Java中,Object是引用类型,因此对象类型值可以包含空值(例如,Integer)。另一方面,基元是值类型而不是引用类型,因此它们不能是null

的Java的设计,因为性能方面的考虑这种方式。使用引用比使用值更慢,消耗内存更多。

0

因为类型例如像整型,布尔等都是值类型他们必须初始化后,有一定的价值。

在C#如果初始化INT那样(不分配任何值):

int someInt; 

在默认分配值0。变量必须有一个特定的值。

引用类型像对象的字符串或实例:

string someString; 
SomeClass someObject; 

在默认分配;