本文是B站up主 十月的寒流 的相应视频的学习笔记,可以直接访问该视频获取更详细的讲解:
C#中问号(?)运算符的历代新增用法

C# 1.0 三目运算符

string res = x >5 ? "goood" : "no"

C# 2.0 可为空的值类型(Nullable Value Types)

int? x = null;
上述代码本质上是Nullable<int> x = null
int? y = default即该int?类型的默认值不再是int类型的默认值0,而是null
int? 还是值类型,不是引用类型

C# 6.0 Null Propagator(空引用传递)

短路机制
1.对于属性的访问,遇到第一个null就直接返回null:
string childName = p?.Child?.Name;
2.对于方法的调用,遇到第一个null就停止:
p?.Child?.SayHello();
3.?[]:
var firstLetter = p?.Name?[0]; //实际上firstLetter就是一个char?
PropertyChanged?.Invoke(); //在调用事件的时候,可以不用关注事件是否是null

C# 8.0 Null-Coalescing ?? (空合并)

message = message ?? GetMessage(); //如果??左边为null则返回右边的值
可以升级简化为:message ??= GetMessage();

C# 8.0 Nullable Reference Type 可为空的引用类型

string? //C#中string是引用类型

C# 8.0 Null-Forgiving Operator(空包容)

var box = this.FindName("box") as TextBox;
box!.Text = "Hello";

表面我确定这个box一定能找到,一定不为空