C# 中问号的几种用法

在 C# 中 ? 有一些特殊用法。

1. 可空类型修饰符 T?

引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空,例如:

1
2
3
4
5
6
7
8
9
10
11
string str = null; // 是正确的。
int a = null; // 编译器将报错。
int? b = null; // 是正确的。

/*
为了使值类型也可为空,可空类型出现了,可空类型使用可空类型修饰符 ? 来表示,表现形式为 T?。
例:int? 表示是可空的整形,DateTime? 表示为可空的时间。
T? 其实是 System.Nullable<T>(泛型结构)的缩写形式,
也就意味着当你用到 T? 时编译器在编译时会把 T? 编译成 System.Nullable<T> 的形式,
例如:int?,编译后便是 System.Nullable<int> 的形式。
*/

2. 三元运算符表达式 ? :

1
int a = b ? c : d; // 如果 b 满足条件,则 a = c,否则 a = d。

3. 空合并运算符 ??

1
string a = b ?? c; // 如果 b != null 则 a = b,否则 a = c。

4. 对象后面的 ?

1
2
GameObject go = null;
go?.SetActive(true); // 等价于 if (go != null) { go.SetActive(true); }