C# 中的空条件运算符(?.)与空合并运算符(??)详解

在日常 C# 编程中,我们经常需要判断对象是否为空(null),

否则直接访问成员可能会抛出 NullReferenceException

为了解决这种繁琐的空判断,C# 提供了两个非常实用的语法糖:

  • ?. ------ 空条件运算符(null-conditional operator)
  • ?? ------ 空合并运算符(null-coalescing operator)

✳️ 一、空条件运算符(?.

✅ 语法:

csharp 复制代码
A?.B

💬 含义:

如果 A 不为 null,返回 A.B

如果 Anull,整个表达式直接返回 null

🧩 等价写法:

csharp 复制代码
var result = (A != null) ? A.B : null;

💡 示例:

csharp 复制代码
Person p = null;

// 不会抛异常,直接返回 null
var name = p?.Name;    

// 等价于:
string name = (p != null) ? p.Name : null;

这样写的好处是:安全访问,不会触发空引用异常。


✳️ 二、空合并运算符(??

✅ 语法:

csharp 复制代码
A ?? B

💬 含义:

  • 如果左侧 A 不为 null,返回 A
  • 如果左侧 Anull,返回右侧 B

🧩 等价写法:

csharp 复制代码
var result = (A != null) ? A : B;

💡 示例:

csharp 复制代码
string name = userName ?? "匿名用户";

如果 userNamenull,则结果为 "匿名用户"


⚙️ 三、组合使用:?.??

这两个运算符常常配合使用,用于安全访问链式对象,并提供默认值。

🌰 示例:

csharp 复制代码
var name = player?.Info?.Name ?? "未知玩家";

解释:

  1. player?.Info?.Name

    • 如果 playerInfonull,整个表达式结果为 null
  2. ?? "未知玩家"

    • 如果左侧是 null,则使用 "未知玩家"

最终效果:

👉 安全地获取玩家名称,如果取不到,就返回一个默认字符串。


⚡ 四、总结对比

运算符 名称 用法 含义 等价逻辑
?. 空条件运算符 A?.B 如果 A 不为空则访问 A.B,否则返回 null (A != null) ? A.B : null
?? 空合并运算符 A ?? B 如果 A 为空则返回 B,否则返回 A (A != null) ? A : B

🎯 五、实际使用建议

  • 使用 ?. :当你不确定对象是否为 null,但仍要访问其成员。
  • 使用 ??:当你想在值为空时提供一个默认值。
  • 组合使用player?.Info?.Name ?? "未知" 是最常见的写法。

✅ 小结

表达式 说明 结果
A?.B 如果 A 不为空返回 A.B,否则 null A == null ? null : A.B
A ?? B 如果 A 不为空返回 A,否则 B A == null ? B : A
A?.B ?? C 如果 A 为空或 A.B 为空,返回 C 安全且简洁的写法

✍️ 示例总结:

csharp 复制代码
var playerName = player?.Info?.Name ?? "暂无玩家";

👉 安全访问对象属性链,并提供默认值。

避免 NullReferenceException,代码更优雅。

相关推荐
唐青枫1 小时前
别把日志、权限写进业务方法:C#.NET 动态代理从原理到实战
c#·.net
fujisheng6613 小时前
Unity UI 生命周期状态机:处理 Covered、异步竞态与事务回滚
c#·unity3d
leoZ2318 小时前
第 8 篇:与 AI 协作的工作流 + 完整案例
前端·人工智能·神经网络·自然语言处理·性能优化·c#·php
fujisheng66110 小时前
Unity 异步 UI 实战:取消令牌、版本校验与旧句柄隔离
c#·unity3d
额鹅恶饿呃11 小时前
随着CentOS官方停服的时间越来越久,大量仍在使用CentOS7的企业和运维从业者
java·python·算法·c#·ruby
乌药ice11 小时前
c#中一个多线程安全的HashSet
开发语言·c#
lfSeanDragon11 小时前
数据结构-前缀树(Trie)
开发语言·c#
张人玉12 小时前
基于 C# WinForms + .NET 8 + SQLite + TCP Socket 的多连接通讯调试工具——TCP通讯助手(TcpAssistant)
tcp/ip·sqlite·c#·.net
mldong19 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
samble1 天前
从零搭建工业控制系统(二十二):线程安全与并发控制
c#·wpf·并发·mvvm·线程安全·工业控制