了解 C# 空凝聚操作符
C# 中的 null coalescing 操作符 (??) 允许开发人员简化 null 检查逻辑,减少代码冗余并提高可读性。 该操作符提供了一种简洁的方法,可在遇到 null 时分配回退值,而无需编写冗长的 if-else 条件。 在本文中,我们将跟随 Gerald Versluis 的视频"了解 C# 空凝聚操作符(? 和??=)"。我们将分解视频的关键部分,分析 Gerald 如何演示这一实用的 C# 功能。
简介
在视频的开头,Gerald 介绍了空值凝聚运算符,它是 C# 的一项强大功能,可以大大减少空值检查所需的代码行数。 他强调,该操作符简化了条件检查,使代码更具可读性。 为了说明这些工具的优势,Gerald 通过一个示例应用程序,实现并解释了 null coalescing 操作符的各种用例。
示例应用程序大纲
Gerald 首先设置了一个简单的控制台应用程序。 他提到,在以前的视频中,他曾使用 try.dot.net 网站进行演示,但由于版本限制(仅支持 C# 7),他改用 Visual Studio for Mac。 他保证这些示例也能在 Visual Studio for Windows 上使用。
为了准备演示,Gerald 创建了一个基本的Name属性:
public class Person
{
public string Name { get; set; }
}public class Person
{
public string Name { get; set; }
}然后,他初始化了该类的一个实例,以展示 null coalescing 运算符在实际场景中的功能。
用空-凝聚操作符(?
Gerald 现在演示如何使用空凝聚运算符 (??) 来简化空检查逻辑。 他将空值赋给Name属性,然后使用?? 以提供后备值:
var name = person.Name ?? "Gerald";var name = person.Name ?? "Gerald";Gerald 解释说,在使用该操作符之前,开发人员会使用 if 语句:
string name;
if (person.Name == null)
{
name = "Gerald";
}
else
{
name = person.Name;
}string name;
if (person.Name == null)
{
name = "Gerald";
}
else
{
name = person.Name;
}通过使用??,该逻辑简化为一行。当person.Name为空时,赋值为"Gerald"; 否则,person.Name保持其值不变。 他运行程序并确认输出正确无误。
空凝聚以抛出异常
接下来,Gerald 将探讨另一个用例:使用空凝聚运算符抛出异常。 他演示了如何在遇到 null 时抛出异常,而不是提供一个后备值:
var name = person.Name ?? throw new ArgumentNullException(nameof(person.Name), "Name cannot be null");var name = person.Name ?? throw new ArgumentNullException(nameof(person.Name), "Name cannot be null");Gerald 强调指出,这在处理方法参数或属性(不允许使用 null)时尤其有用。 他解释说,这一功能是在 C# 7 或 8 中引入的,具体取决于项目设置。 在ArgumentNullException,有效地防止了意外的空引用。
空凝聚复合赋值 (??=).
Gerald 接着讨论了 null coalescing 复合赋值 (??=) 操作符,该操作符提供了一种更加简化的默认值赋值方式。 而不是写成
if (person.Name == null)
{
person.Name = "Gerald";
}if (person.Name == null)
{
person.Name = "Gerald";
}他简化了这一点:
person.Name ??= "Gerald";person.Name ??= "Gerald";Gerald 解释说,??= 只有在左侧操作数为空的情况下才赋值。 如果person.Name已具有值,则保持不变。 该操作符对于初始化字段或确保变量永不为空特别有用。
与 Null 条件操作符结合使用
在最后一节中,Gerald 演示了空凝聚运算符如何与空条件运算符 (?.) 结合使用。 空条件运算符允许安全访问属性而不会引发NullReferenceException。 他举了一个例子:
var length = person?.Name?.Length ?? 0;var length = person?.Name?.Length ?? 0;Gerald 解释说,这确保了如果Name为空,结果将默认为0,而不是抛出异常。 这种组合在处理空引用类型或复杂对象层次结构时非常有用。
结论
在整个视频中,Gerald Versluis 有效地解释了空凝聚运算符 (??) 和空凝聚复合赋值 (??=) 的强大功能。 他演示了这些运算符如何取代传统的 null 检查,使代码更加简洁易读。 通过利用这些功能,开发人员可以编写出更简洁、更高效的 C# 应用程序。
如果您有兴趣了解这些概念的实际应用,请查看 Gerald Versluis 的完整视频 "了解 C# 空凝聚操作符(? 和 ?=)"。

