c# 如何中的 ? 与 ??
c# 如何中的 ? 与 ??
C# 中的 ?.
和 ??
运算符详解
在 C# 中,?.
(null 条件运算符)和 ??
(null 合并运算符)是两个非常有用的运算符,用于简化 null 值检查和处理。
1. ?.
(Null 条件运算符)
?.
运算符用于在访问成员或元素之前检查对象是否为 null。如果对象为 null,则返回 null 而不抛出异常。
基本用法
string name = person?.Name;
// 等同于
string name = (person != null) ? person.Name : null;
链式调用
int? length = people?.FirstOrDefault()?.Name?.Length;
方法调用
person?.PrintName(); // 如果 person 为 null,则不执行方法
数组/集合访问
int? firstItem = array?[0];
2. ??
(Null 合并运算符)
??
运算符用于在左侧表达式为 null 时返回右侧的值。
基本用法
string displayName = name ?? "匿名用户";
// 等同于
string displayName = (name != null) ? name : "匿名用户";
与 ?.
结合使用
string name = person?.Name ?? "未知";
链式使用
string configValue = config?.Settings?.Value ?? "默认值";
3. ??=
(C# 8.0 引入的 Null 合并赋值运算符)
name ??= "默认值";
// 等同于
if (name == null)
{name = "默认值";
}
实际应用示例
class Program
{static void Main(){Person person = null;// 使用 ?. 避免 NullReferenceExceptionstring name = person?.Name;Console.WriteLine(name); // 输出 null// 使用 ?? 提供默认值string safeName = person?.Name ?? "无名氏";Console.WriteLine(safeName); // 输出 "无名氏"// 复杂示例int? age = person?.Age ?? 18;Console.WriteLine(age); // 输出 18// ??= 运算符string nickname = null;nickname ??= "小新";Console.WriteLine(nickname); // 输出 "小新"}
}class Person
{public string Name { get; set; }public int Age { get; set; }
}
注意事项
?.
运算符会改变表达式的类型,使其变为可空类型??
右侧的表达式只有在左侧为 null 时才会计算- 这些运算符可以大大减少代码中的 null 检查样板代码
- 在性能关键路径上,
?.
比手动 null 检查有轻微开销
这两个运算符是现代 C# 编程中处理 null 值的推荐方式,可以使代码更简洁、更安全。