a)? 可空类型修饰符.
引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。
int? age=null;
b)?: 三元运算符.
str=age<18?"未成年":"已成年";
表示如果条件成立,则返回"未成年",否则返回"已成年"。这是省略if{}else{}的简单形式。
c)?? 空合并运算符.
a=b??c
如果b为null,则a=c;如果b不为null,则a=b.
d)?. NULL检查运算符.用于判断对象是否为空并获取对象的某个属性的值,可以代替if判断,简化代码。例如我们要获取一个Point序列的第一个点的X坐标,第一感觉会这么写:
int firstX = points.First().X;
但是,老鸟会告诉你,这儿没有进行NULL检查,正确的版本是这样的:
int? firstX = null;
if (points != null)
{
var first = points.FirstOrDefault();
if (first != null) firstX = first.X;
}
正确倒是正确了,代码取变得难读多了。在C# 6.0中,引入了一个 ?. 的运算符,前面的代码可以改成如下形式:
int? firstX = points?.FirstOrDefault()?.X;
从这个例子中我们也可以看出它的基本用法:如果对象为NULL,则不进行后面的获取成员的运算,直接返回NULL
需要注意的是,由于"?."运算符返回的可以是NULL,当返回的成员类型是struct类型的时候,"?."和"."运算符的返回值类型是不一样的。