int的解释? vs int

时间:2011-06-17 17:26:28

标签: c# variables nullable

  

可能重复:
  What's the difference between 'int?' and 'int' in C#?

我在C#中遇到了一些声明变量为:int? number

的代码

?的含义是什么,以及它与以下内容的区别:int

6 个答案:

答案 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