术语有什么区别
- 没有值
醇>
和
2.Being Null
在C#中的Nullable类型中。
换句话说,我们什么时候说类型没有值,我们什么时候说这个值为空。
答案 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,表示该类型没有任何值。