在 C# 中存在一些特殊的运算符,它们简化了代码的编写,主要用于处理空值(null)或简化成员访问。以下是一些常用的这类运算符:
?? - Null 合并运算符
Null 合并运算符 ??
在左侧的操作数不为 null 时返回左侧的操作数,若为 null 时则返回右侧的操作子。
string name = null;
string username = name ?? "Guest";
// username 的值是 "Guest",因为 name 为 null
在 C# 8.0 及以后的版本中,还加入了 null 合并赋值运算符 ??=
,它可以用来只在左侧操作数为 null 时,才将右侧操作数赋值给左侧。
string name = null;
name ??= "Guest";
// name 的值现在是 "Guest"
?. - Null 条件运算符
Null 条件运算符 ?.
允许在访问对象的成员之前检查是否该对象为 null。如果对象为 null,则返回 null 而不是抛出 NullReferenceException
。
string name = person?.Name; // 如果 person 不为 null,则返回 person.Name;否则返回 null
该运算符也可以用于链式调用,如 person?.Job?.Title
。
?[] - Null 条件索引运算符
Null 条件索引运算符 ?[]
允许在对集合进行索引操作前检查集合是否为 null。
var value = dictionary?["key"]; // 如果 dictionary 不为 null,尝试获取 "key" 的值;否则返回 null
?? - Null 合并运算符(可链接)
你也可以将多个 null 合并运算符链接在一起,为连续的可能为 null 的表达式提供回退值。
string name = first ?? second ?? "Default";
// first 和 second 都为 null 时,name 的值为 "Default"
?. 和 ?? - 组合使用
你可以组合使用 null 条件运算符和 null 合并运算符,以处理可能为 null 的对象并提供默认值。
string title = person?.Job?.Title ?? "Unemployed";
// 如果 person 或 Job 为 null,title 的值为 "Unemployed"
=> - Lambda 表达式
虽然不是用来处理 null,但 =>
是 C# 中另一个常用的运算符,它用来定义 lambda 表达式,描述匿名函数的简短语法。
Func<int, int> square = x => x * x; // 定义一个返回输入值平方的 lambda 表达式
int result = square(5); // result 为 25
??= - Null 合并赋值运算符(C# 8.0)
该运算符是在 C# 8.0 中新加入的,它用来特别简化 null 的检查和赋值语句。
string name = null;
name ??= "Guest"; // 如果 name 为 null,则赋值为 "Guest";否则保持不变
这些运算符极大地简化了与 null 相关的代码,减少了冗长和可能出错的 null 检查代码,同时提高了代码的可读性和可维护性。