在 C# 中,处理 null 值是一个常见的挑战,尤其是当我们需要访问对象的属性或调用方法时。传统的做法是使用 if 语句手动进行 null 检查,但这往往会导致冗长且难以维护的代码。幸运的是,C# 提供了两种非常实用的运算符——?.(空条件运算符)和 ??(空合并运算符),可以让我们更优雅地处理 null 值,从而简化代码并提高可读性。
1. 空条件运算符 ?. —— 安全地访问对象成员
空条件运算符 ?. 允许你在访问对象成员时,自动判断对象是否为 null,如果是 null,则不会抛出 NullReferenceException 异常,而是直接返回 null。
示例:
class Person {
public string Name { get; set; }
}
Person person = null;
string name = person?.Name; // 如果 person 为 null,name 也为 null
Console.WriteLine(name); // 输出:null
在这个例子中,我们无需显式检查 person 是否为 null。通过使用 ?. 运算符,程序会自动判断 person 是否为 null,如果是 null,Name 属性的访问将返回 null,并且程序不会抛出异常。
链式调用:
class Address {
public string City { get; set; }
}
class Person {
public Address Address { get; set; }
}
Person person = null;
string city = person?.Address?.City; // 如果 person 或 Address 为 null,city 会是 null
Console.WriteLine(city); // 输出:null
当涉及到多个嵌套的对象时,空条件运算符 ?. 使得代码变得更加简洁和安全。
2. 空合并运算符 ?? —— 提供默认值
空合并运算符 ?? 允许我们为可能为 null 的表达式提供一个默认值。当左侧的值为 null 时,?? 会返回右侧的默认值。
示例:
Person person = null;
string name = person?.Name ?? "未知"; // 如果 person?.Name 为 null,返回 "未知"
Console.WriteLine(name); // 输出:未知
在这个例子中,如果 person?.Name 结果为 null,则 ?? 运算符会将 "未知" 作为默认值返回。这样,我们就避免了 null 值可能导致的错误,并能保证 name 始终有一个有效的值。
3. 结合使用 ?. 和 ?? 运算符
你还可以将 ?. 和 ?? 运算符结合使用,以进一步简化 null 检查和提供默认值。
示例:
class Person {
public Address Address { get; set; }
}
class Address {
public string City { get; set; }
}
Person person = null;
string city = person?.Address?.City ?? "未知城市"; // 如果 person?.Address?.City 为 null,返回 "未知城市"
Console.WriteLine(city); // 输出:未知城市
通过这种方式,你可以在访问多个嵌套成员时,既能保证代码的简洁性,又能处理 null 值并提供合理的默认值。
总结
C# 中的 ?. 和 ?? 运算符极大地简化了 null 值的处理,减少了冗长的空值检查代码。?. 运算符让你能够安全地访问可能为 null 的对象成员,而 ?? 运算符则为 null 值提供了一个默认值。两者结合使用,可以让你写出更加简洁、易读、且不容易出错的代码。
如果你还不熟悉这些运算符,建议尽快在你的代码中应用它们,提升代码的质量和可维护性。