C#中Nullable类型“没有值”和“为空”之间的区别

时间:2014-01-03 16:08:54

标签: c#

术语有什么区别

  
      
  1. 没有值
  2.   

  

2.Being Null

在C#中的Nullable类型中。

换句话说,我们什么时候说类型没有值,我们什么时候说这个值为空。

4 个答案:

答案 0 :(得分:4)

Nullable<T>是一个结构体,作为一个结构体,它实际上不能为空。存储在Nullable<T>中的唯一实际数据是类型T的基础值和布尔HasValue标志。 Nullable<T> false HasValue值可以被视为null,即使它在技术上不为空。

有一些编译器魔法可以调用someNullable == null,并且该表达式的结果实际上与someNullable.HasValue相同。您也可以将null分配给Nullable<T>。这实际上会做的是创建一个Nullalbe<T>结构HasValue false Nullalbe<T>。 (有趣的是,如果你要编写自己的类型,你自己也不可能这样做。)

还有一些编译器魔法,如果你装箱HasValue它实际上并没有包装可空类型。如果HasValue实际上是真的那么它将拉出基础值并将其框出来。如果null为false,则只会Nullable框。当将某些东西拆箱到Nullable<T>时,它会反过来;根据它是否为null来创建Nullable结构。 (这是使用自定义类型无法做到的另一件事。)

由于这些特殊的编译器功能,它可以很好地使显示,好像null实际上可以是null,但实际情况是它不是实际上 {{1}}。

答案 1 :(得分:2)

Nullable<T>本身不能为空,因为它是一个结构。因此,您可能会发现Nullable<T>跟随案例:Not having a value但实际上并非空。

编辑:

  

---------------------------- 没有价值案例 ------- 可以为空案例

     
     

引用类型 ----(等于可以为null)--------可能

     

值类型 ------------不可能------------------------ ---不可能

     

Nullable -----------------可能--------------- -----------不可能

此处,Nullable和Value类型的分离并不意味着Nullable不是值类型。

答案 2 :(得分:0)

有人提到通用可空类型Nullable<T>(其中T必须是值类型)具有重要属性:

bool HasValue // Indicating that a real value is present, or if the instance should be considered null
T Value        // Your value, if present. (non-nullable)

所以你可以想象Nullable<int> myInt

这些案例
HasValue  |  Value  |  Represents
------------------------------
false     |   0     | No Value / null
true      |   0     |    0
true      |   3     |    3

在第一种情况下,HasValue表示myInt没有值,代表null状态;与null文字相等的比较将被视为true:

(myInt == null) // true.

可空类型本身实际上不会为空(它是一个结构,它不可能是),但编译器将通过查询HasValue来解析空比较,如另一个{{1}}中提到的那样{{ 3}}

答案 3 :(得分:0)

如果我们正在讨论条款,请用语言清楚。正如许多其他答案所说,在c#中,当使用?运算符使非可空类型可为空时,它将成为Nullable结构,其中T将始终是值类型。

参考:http://msdn.microsoft.com/en-us/library/b3h38hb0(v=vs.110).aspx

请参阅Servy的答案,以便对此进行详细解释。

但是,一旦任何类型都可以为空(无论它是引用类型还是已经使用Nullable结构),如果类型没有值,则类型为null,并且副反之亦然。从上面的Microsoft文档:

  

如果可以为类型分配值,则可以将类型视为可为空   赋值为null,表示该类型没有任何值。