C#的表达式中的问号

前两天在一个开源代码里面看到表达式中有一个问号,不同于判断语句的问号,感觉有点奇怪,查了些资料总结一下。

一、? : 操作符
这个操作符比较熟悉,用来做条件判断,如下:
条件?第一个表达式:第二个表达式

具体用法这个就不详说了。
注:Visual Studio 2003之后有效

二、Nullable类型
Nullable类型可以为所有的类型并额外附带一个 null 值。
用法如下

int? x = 0; // x可以为任意整数和一个null
x = null;
var isXNull = (x == null) ? true: false;
Console.WriteLine(isXNull); // true

x = 15;
isXNull = (x == null) ? true: false;
Console.WriteLine(isXNull); // False
注:Visual Studio 2005之后有效

三、null 条件操作符
可用于自动判定 一个对象访问值是否是null,不会抛出系统 空指针异常。
例如:
var stu = CreateStudent(“myname”);
Console.WriteLine(stu.Name) ;// 正常
var stu2 = CreateStudent(“”) ;//这里对对象的Name没有赋值
Console.WriteLine(stu2.Name);//抛出异常:System.NullReferenceException: Object reference not set to an instance of an object.

如果想要正常输出我们一般需要判断Name属性是否为null,如下
if (null != stu2.Name) {
Console.WriteLine(stu2.Name);//ok
}

还有一种写法,可以跳过这个难看的if语句
Console.WriteLine(stu2?.Name); //ok
注:Visual Studio 2015之后有效

四:?? 空合并操作符
规则:A??B
判断A是否为null,如果为null,则返回B;如果不为null,返回A;
例子:
var x = null;
var y = x ?? 1;
这里如果x为null,那么y最后值是1,如果x不为null,那么y=x;
注:Visual Studio 2005之后有效