int的解释?vs int

5n0*_*0u7 13 c# variables nullable

可能重复:
'int?'之间有什么区别?和C#中的'int'?

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

?意味着什么,以及它与以下内容有何不同:int

Kyl*_*man 20

int不可能null.

int?Nullable<int>结构的别名,您可以将其设置为null.

  • 请注意,`int?`是*也*是一种值类型,但它与你的第一句话的"定义"相矛盾...... (7认同)

IRO*_*GBU 10

int?是创建通用System.Nullable<T>结构类型实例的简写.它允许您使变量可以为空.请记住,鉴于<ValueType>?语法是简写,您可以声明您的变量:

Nullable<int> i = 10;
Run Code Online (Sandbox Code Playgroud)


Ant*_*ram 5

int?是简写Nullable<int>,允许您假装一个整数可以处理空值.

int? foo = null;
Run Code Online (Sandbox Code Playgroud)

它对于指示过去曾使用过魔术值(-1)的值缺乏很有用,并且在处理允许空条目的数据库列时也很有用.

对于一个准深度的外观,a Nullable<T>(在.NET 2.0中引入)只是一个值类型的包装器,T它暴露了两个属性,HasValue并且Value,其中HasValue是一个布尔值,指示值是否已设置且Value(显然已足够)返回价值.Value如果HasValue为false则访问是错误的.因此,要访问Value,HasValue首先检查是一种好的形式.此外,如果您只想将任何非值标准化为默认值(数字类型为0),则GetValueOrDefault()无需检查即可使用该方法HasValue.

请注意,尽管您似乎设置foonull,但在正常使用情况下它实际上并不为 null.null这种类型只是额外的语法糖.上面的代码行转换为

Nullable<int> foo = new Nullable<int>();
Run Code Online (Sandbox Code Playgroud)

以这种方式初始化变量只是将HasValue属性设置为false.

但是,在涉及装箱的情况下,如果HasValue为false ,则该值实际上将为空(否则将为方框T).注意后果!例如,在:

int? foo = null; 
string bar = foo.ToString(); // this is fine, returns string.Empty
Type type = foo.GetType(); // blows up! GetType causes the value to box
                           // resulting in a NullReferenceException
Run Code Online (Sandbox Code Playgroud)

那是一个快速的速成课程.有关更多信息,请访问文档.