[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 引入的语法糖,显著提升代码简洁性和安全性,尤其适合处理嵌套对象或不确定是否为空的情况。合理使用能减少冗余代码,但需注意避免滥用导致隐藏潜在问题。

posted @ 2025-10-07 14:44  修道者~  阅读(36)  评论(0)    收藏  举报