引用类型的变量可以为空, 而值类型的变量不能。
在一些情况下,这可能是一个问题。
C#有一个解决方案: 可空类型。 可空类型是可以为空的值类型。 可空类型只需要在类型的后面添加 " ? " 。
在下面的代码片段中, x1 是一个普通的 int , x2 是一个可以为空的 int。 因为 x2 是可以为空的 int, 所以可以吧 null 分配给 x2:
int x1 = 1;
int? x2 = null;
因为 int 值可以分配给 int? 所以给 int? 传递一个int变量是允许的
int? x3 = x1;
但是反过来就不可以了, int?不能直接分配给 int, 因此需要一个类型转换:
int x4 = (int) x3;
当然,如果 x3 的值是一个 null, 类型转换操作就会发生异常。 更好的方法是使用可空类型的 HasValue 和 Value 属性。 HasValue返回true 或 false, 这取决于可空类型是否有值, Value 返回底层的值。
int x5 = x3.HasValue ? x3.Value :-1; // 如果x3的值为null 就返回false ,会把 -1赋值给 x5
使用合并操作符,可以让代码变的更简洁。
int x6 = x3 ?? -1; // 如果x3的值是null , 则把 -1赋值给 x6
注意:对于可空类型,可以使用能用于基本类型的所有可用操作符, 例如可用于 int? 的 +、-、*、/ 等。 每个结构类型都可以使用可空类型, 而不仅是预定义的C#类型