我在C#中遇到了一些声明变量为:int? number
?
的含义是什么,以及它与以下内容的区别:int
答案 0 :(得分:19)
int
不能是null
。
int?
是Nullable<int>
结构的别名,您可以将其设置为null
。
答案 1 :(得分:10)
int?
是创建通用System.Nullable<T>
结构类型实例的简写。它允许您使变量可以为空。请记住,鉴于<ValueType>?
语法是简写,您可以声明变量:
Nullable<int> i = 10;
答案 2 :(得分:5)
int?
是Nullable<int>
的简写,它允许您假装整数可以处理空值。
int? foo = null;
在过去使用过魔术值(-1)的情况下,指示缺少值很有用,在处理允许空条目的数据库列时也很有用。
对于准深入的外观,Nullable<T>
(在.NET 2.0中引入)只是值类型T
的包装器,它公开了两个属性HasValue
和{ {1}},其中Value
是一个布尔值,表示该值是否已设置,HasValue
(显然已足够)返回该值。如果Value
为false,则访问Value
会出错。因此,要访问HasValue
,最好首先检查Value
。此外,如果您只想将任何非值标准化为默认值(数字类型为0),则可以使用方法HasValue
而无需检查GetValueOrDefault()
。
请注意,虽然您似乎将HasValue
设置为foo
,但在正常使用情况下,它实际上不是 null。 null
只是这种类型的附加语法糖。上面的代码行转换为
null
以这种方式初始化变量只是将Nullable<int> foo = new Nullable<int>();
属性设置为false。
但是,在涉及装箱的情况下,如果HasValue
为假,则该值实际上将为空(否则将为HasValue
框)。注意后果!例如,在:
T
这是一个快速速成课程。有关更多信息,请访问documentation。
答案 3 :(得分:4)
它是Nullable<int>
基本上您的数字(或任何其他值类型)可以为null以及它的值。您使用HasValue属性检查值。它们可以转换为它们的值类型(虽然如果它们为null,它将失败)或者你可以使用Value属性(如果它为null,它将再次抛出异常)
使用可空类型时通常会忽略的一件事是GetValueOrDefault()方法,如果对象为null,则返回默认值(T)。
正如@Kyle Trauberman在评论中指出的那样,你确实可以将它与null进行比较而不是检查HasValue。类型本身是一个带有覆盖相等方法的值类型,因此它本身永远不会为null,如果它没有值,它将返回true,如果它没有值,则返回null。
答案 4 :(得分:3)
声明背后的问号意味着变量可以为空。
答案 5 :(得分:2)
INT?可以为null,而int不能。
参考可空类型: http://msdn.microsoft.com/en-us/library/1t3y8s4s(v=VS.100).aspx