C# 可空类型
https://www.w3cschool.cn/csharp/csharp-nullable.html
https://www.runoob.com/csharp/csharp-nullable.html
1、C# 可空类型(Nullable)
(1) Nullable 类型(可空类型)是C# 中一个特殊的数据类型,可空类型表示其基础值类型正常范围内的值,再加上一个 null 值。
例如:Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也可以被赋值为 null 值。
类似的,Nullable< bool > 变量可以被赋值为 true 或 false 或 null。
(2) 应用场景:在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能特别有用。例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义。
2、C# 可空类型运算符(?) 、 空合并运算符(??)、空检查运算符(?.)
(1) 单问号? 可空类型运算符
( ? ) : 单问号用于将不可为空的值类型申明为可空类型,如 int,double,bool 等类型,然后就可以用 null 赋值。实际上T? 是System.Nullable<T>的缩写形式,编译时编译器会把T?翻译成System.Nullable<T>的形式。
例如:int?,编译后便是System.Nullable<int>的形式。
int? i = 3
//等同于
Nullable<int> i = new Nullable<int>(3);
int i; //默认值0
int? ii; //默认值null,int?实际是Nullable<int>,是类类型,所以默认值是null
(2) 双问号?? 空合并运算符
01. ( ?? )称为:Null 合并运算符。
02. 作用:当一个变量为 null 时,返回一个默认值。
valNew = val ?? 999; // val不为null则返回val,否则返回999
//等价于
valNew = val != null ? val : 999;
03. 空合并运算符为右结合运算符,即操作时从右向左进行。
如:“a??b??c” 按 “a??(b??c)” 顺序计算。
(3) ?. 空检查运算符
01. ( ?. )称为:空检查运算符。
02. 作用:如果对象为NULL,则不进行后面的获取成员的运算,直接返回NULL。就是在取成员运算符(.)上加入空判断(?)。
03. 例如:
要获取一个Point序列的第一个点的X坐标,第一感觉会这么写:int firstX = points.First().X;
但是,此处有点问题,没有进行NULL检查,正确的版本是这样的:
int firstX = 0;
if (points != null)
{
var first = points.FirstOrDefault();
if (first != null)
firstX = first.X;
}
以上代码倒是正确了,但代码取变得复杂多了。使用 ?. 的运算符,前面的代码可以改成如下形式:
int? firstX = points?.FirstOrDefault()?.X; // 此处返回的是可空的类型