当前位置: 首页 > news >正文

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; }
}

注意事项

  1. ?. 运算符会改变表达式的类型,使其变为可空类型
  2. ?? 右侧的表达式只有在左侧为 null 时才会计算
  3. 这些运算符可以大大减少代码中的 null 检查样板代码
  4. 在性能关键路径上,?. 比手动 null 检查有轻微开销

这两个运算符是现代 C# 编程中处理 null 值的推荐方式,可以使代码更简洁、更安全。

http://www.xdnf.cn/news/743779.html

相关文章:

  • “粽”览全局:分布式系统架构与实践深度解析(端午特别版)
  • 《信号与系统》第 5 章 离散时间傅里叶变换
  • 2025年- H61-Lc169--74.搜索二维矩阵(二分查找)--Java版
  • Qt -下载Qt6与OpenCV
  • Python训练营打卡Day41
  • 5G-A:开启通信与行业变革的新时代
  • 2025年渗透测试面试题总结-匿名[校招]渗透测试(打击黑灰产)(题目+回答)
  • Python实现P-PSO优化算法优化循环神经网络LSTM回归模型项目实战
  • 华为OD机试真题——文件目录大小(2025 A卷:100分)Java/python/JavaScript/C++/C语言/GO六种语言最佳实现
  • (11)课29--30:navicat 的用法;行转列的查询与典型算法,并涉及分组(学生各科成绩与比赛胜负);
  • 【Unity】AudioSource超过MaxDistance还是能听见
  • AI笔记 - 网络模型 - mobileNet
  • [蓝桥杯]机器人塔
  • Java 文件操作 和 IO(5)-- 综合案例练习 -- 示例一
  • antddesign使用iconfont的字体库和图标库
  • 微服务中引入公共拦截器
  • python从零开始实现四极场离子轨迹仿真——框架
  • 深入理解设计模式之访问者模式
  • 帕金森带来的生活困境
  • Centos系统搭建主备DNS服务
  • Java 数据处理 - 数值转不同进制的字符串(数值转十进制字符串、数值转二进制字符串、数值转八进制字符串、数值转十六进制字符串)
  • 【Bluedriod】蓝牙协议栈GD模块(GD_SHIM_MODULE)启动机制及源码解析
  • LXQt修改开始菜单高亮
  • 第12讲、Odoo 18 权限控制机制详解
  • kafka核心组件
  • Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
  • MySql(九)
  • 【stm32开发板】单片机最小系统原理图设计
  • 基于大模型的数据库MCP Server设计与实现
  • 自动驾驶系统研发系列—端到端自动驾驶:愿景、陷阱与现实博弈