可空types“int?”(包括问号)的默认值是什么?
在C#中,types为int?
的类实例variables的默认值是int?
?
例如,在下面的代码中,如果MyNullableInt
从未明确分配, MyNullableInt
具有什么值?
class MyClass { public int? MyNullableInt; }
(似乎答案几乎可以肯定是null
或0
,但那是哪一个呢?)
int?
的默认值int?
– 对于使用“type?”的任何可空types 声明 – 为null
。
为什么是这样的情况:
-
int?
是typesNullable <T> (其中T是int
)的结构体的语法糖。 ( 参考 ) -
Nullable<T>
types有一个bool HasValue成员,当它为false
,使Nullable<T>
实例的行为像一个null
值。 特别是, Nullable <T> .Equals方法被覆盖,以便在将HasValue == false
的Nullable<T>
与实际的null
值进行比较时返回true
。 - 从C#语言规范11.3.4中 ,结构实例的初始默认值是该结构的所有值types字段被设置为其默认值,并且该结构的所有引用types字段都被设置为
null
。 - C#中
bool
variables的默认值是false
( 引用 )。 因此,默认Nullable<T>
实例的HasValue
属性为false
; 这又使得Nullable<T>
实例本身的行为像null
。
我觉得分享Nullable<T>.GetValueOrDefault()
方法非常重要,在使用Nullable<int>
aka int?
math计算时,这个方法特别方便int?
值。 有很多时候你不必检查HasValue
属性,而只需要使用GetValueOrDefault()
。
var defaultValueOfNullableInt = default(int?); Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString()); var defaultValueOfInt = default(int); Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt); Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());
var x = default (int?); Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString());