[C#基础教程]空条件运算符(?.)
在C#中,?. 是空条件运算符(Null-Conditional Operator),用于简化对可能为 null 的对象的成员访问或方法调用,避免抛出 NullReferenceException 异常。以下是其核心特性和用法:
功能说明
1.安全访问成员
当左侧对象为 null 时,整个表达式直接返回 null,而不会继续执行右侧操作;若不为 null,则正常访问成员或调用方法。
string name = user?.Profile?.Name; // 若 user 或 Profile 为 null,name 为 null
2.链式调用支持
可安全嵌套使用,处理复杂对象图:
int? length = customers?[0]?.Orders?.Count; // 安全访问数组、属性和集合
3.与方法/委托结合
安全调用方法或触发事件:
user?.Save(); // 若 user 为 null,不执行 Save() onChanged?.Invoke(); // 安全触发事件
4.与 ?? 合并使用
提供默认值:
string displayName = user?.Name ?? "Guest"; // 若 Name 为 null,返回 "Guest"
典型场景
● 避免空引用检查
替代冗长的 if 判断:
// 传统写法 if (obj != null && obj.Property != null) { ... } // 使用 ?. var value = obj?.Property;
● API/数据库查询
安全处理可能为 null 的查询结果:
var email = dbContext.Users.FirstOrDefault(u => u.Id == id)?.Email;
● Unity 游戏开发
安全访问组件:
var rigidbody = gameObject?.GetComponent<Rigidbody>();
注意事项
1.返回值类型
若成员是值类型(如 int),表达式返回其可空版本(如 int?)。
int? age = person?.Age; // Age 为 int 时,返回 int?
2.潜在问题
- 过度使用可能掩盖逻辑错误(如本应非空的对象意外为
null)。 - 性能上会有轻微开销(每次访问需检查
null)。
3.与 ?[] 结合
安全访问集合或数组:
var firstItem = list?[0]; // 若 list 为 null,返回 null
示例对比
// 传统写法 if (user != null && user.Profile != null) { Console.WriteLine(user.Profile.Name); } // 使用 ?. Console.WriteLine(user?.Profile?.Name);
总结
?. 是 C# 6.0 引入的语法糖,显著提升代码简洁性和安全性,尤其适合处理嵌套对象或不确定是否为空的情况。合理使用能减少冗余代码,但需注意避免滥用导致隐藏潜在问题。
浙公网安备 33010602011771号