C#---? ?? ?. ?: 好几种问号符号的使用方法




参考博客:
幽冥狂_七

可空修饰符:?

首先在C#中,引用类型可以为null,而值类型不能为null。

为什么值类型不能为null,引用可以为null的解释
https://www.cnblogs.com/Fflyqaq/p/14212505.html

为了使值类型也可为空,就需要使用可空类型,即用可空类型修饰符"?“来表示,表现形式为"T?"。
T?其实就是System.Nullable的缩写形式,编辑器会自动把T?编译成System.Nullable的形式。

int n1 = null;    //编译报错
GameObject g1 = null;

//n2  n3二者等价
int? n2 = 10;
System.Nullable<int> n3 = 10;
int? n4 = null;    //正常运行

空合并运算符:??

GameObject g1 = null;
GameObject g2 = new GameObject();

//如果g1不为null,返回g1。否则返回g2。
GameObject g3 = g1 ?? g2;

//右结合运算符,相当于g1 ?? (g2 ?? g3)
GameObject g4 = g1 ?? g2 ?? g3;

null检查修饰符:?.

例如我们要获取一个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中,引入了一个 ?. 的运算符,前面的代码可以改成如下形式:

//如果points为null,则直接返回null
int? firstX = points?.FirstOrDefault()?.X;

需要注意的是,由于"?.“运算符返回的可以是NULL,当返回的成员类型是struct类型的时候,”?.“和”."运算符的返回值类型是不一样的。

Point p = new Point(3, 2);
//二者类型不同
Console.WriteLine(p.X.GetType() == typeof(int)); //true
Console.WriteLine(p?.X.GetType() == typeof(int?)); //true

三元表达式:?:

//括号内为true,返回?后的,否则返回:后的。
bool test = (10 == 11) ? true : false;
原文地址:https://www.cnblogs.com/Fflyqaq/p/14212528.html