C# 如何使用?、? 和 ??的区别和使用案例

目录

? 运算符

使用案例

?? 运算符

使用案例

总结


在 C# 中,? 和 ?? 运算符在处理 null 值时起着不同的作用,并且具有特定的使用场景。

? 运算符

? 运算符,也称为空条件运算符,在 C# 6.0 及更高版本中引入。它允许你在不进行显式类型转换的情况下检查引用类型的变量是否为 null。如果变量为 null,则整个表达式的结果也是 null,并且不会执行 ? 之后的代码块。这有助于避免空引用异常。

使用案例

假设我们有一个方法,该方法返回一个字符串,或者在某些情况下返回 null

string GetNullableString();

如果我们想在返回的字符串上调用一个方法(例如 .Length),直接调用可能会引发异常,因为如果返回的是 null,尝试获取其长度会导致空引用异常。使用 ? 运算符可以安全地解决这个问题:

string result = GetNullableString()?.Length;

如果 GetNullableString() 返回 null,则整个表达式的结果也是 null,不会尝试访问 Length 属性。

?? 运算符

?? 运算符是一个逻辑运算符,也称为空合并运算符。当左侧的操作数为 null 时,它返回右侧的操作数作为结果。如果左侧的操作数不为 null,则返回左侧的操作数。它通常用于为可能为 null 的变量提供一个默认值。

使用案例

假设我们有一个字符串变量,可能没有初始化:

 
string someString;

如果直接访问这个变量的长度,因为它是 null,会抛出空引用异常。我们可以使用 ?? 运算符来提供一个默认值:

int length = someString ?? "default".Length;

如果 someString 是 null,则整个表达式的结果是 0(因为 .Length 会返回字符串的长度),否则是 someString.Length 的值。

可空类型修饰符 (?)

  • 这个符号用于声明一个可空引用类型或值类型。当应用于引用类型时(如 string?),它表示该变量可以存储 null 值,而不仅仅是非空引用。
  • 使用案例:

    string? nullableString = null; // 可以为 null 的字符串

当然,可空类型修饰符 (?) 在 C# 中的应用不仅仅局限于声明可以为 null 的变量,还可以结合 null-conditional 运算符一起使用,进行更便捷的条件访问和方法调用。这里有一个例子:
 

int? value = GetNullableInt(); // 假设这个方法可能返回一个整数或 null// 使用 null-conditional 运算符 ?. 来安全地访问成员或调用方法
// 如果 value 为 null,则整个表达式结果也为 null,不会抛出 NullReferenceException
int? doubledValue = value?.GetValueOrDefault() * 2;// 或者在链式调用中使用它来避免空引用异常
string message = value.HasValue ? $"The value is {value.Value}" : "No value provided";
string safeMessage = value?.ToString() ?? "No value provided"; // 如果 value 为 null,则使用默认消息// 对于集合类,也可以安全检查其元素
List<int>? numbers = GetNullableListOfNumbers();
int firstNumberOrDefault = numbers?.FirstOrDefault(); // 如果 numbers 为 null,则结果为 null
```

在这段代码中,`?.` 是 null-conditional 运算符,与可空类型修饰符一同作用时,它允许我们在访问成员或调用方法时进行安全的条件检查,如果前面的对象是 null,则整个表达式会立即停止计算并返回 null,而不会尝试对 null 引用执行操作导致运行时错误。

总结

  • ? 运算符:用于安全地检查引用类型变量是否为 null,并避免执行可能引发异常的代码块。如果变量为 null,整个表达式的结果也是 null
  • ?? 运算符:用于为可能为 null 的变量提供一个默认值。如果左侧的操作数为 null,则返回右侧的操作数作为结果。
  • 可空类型修饰符 :这个符号用于声明一个可空引用类型或值类型,表示该变量可以存储 null 值,而不仅仅是非空引用

欢迎阅读:

50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)

50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

08-React路由(Router 6版本)

Router5和Router6的变化 部分标签产生了变化&#xff0c;之前的标签都有了替&#xff08;主要集中在Route匹配上&#xff09;&#xff0c;所以这里先回顾一下Router5&#xff0c;同时引出Router6的一些新特性 其次&#xff0c;React官方在推出Router6之后&#xff0c;就明确推…

OpenCV-Python(9):图像基础操作

目录 学习目标 获取图像像素并修改像素值 获取图像属性 图像ROI 拆分及合并图像通道 图像边缘扩充 学习目标 获取像素值并修改获取图像的属性(信息)图像的ROI获取图像通道拆分及合并图像扩边 获取图像像素并修改像素值 几乎所有这些操作与Numpy 的关系要比与OpenCV 的…

【电商项目实战】MD5登录加密及JSR303自定义注解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

飞书文档如何转markdown

飞书文档如何转markdown 实现效果实现步骤其他方法 实现效果 导出的结果挂在这了 https://thinkasany.github.io/docs/#/ 实现步骤 以https://upyun.feishu.cn/docx/KERsd1DpioPb1xxye9VcuXbhnBC这篇文章为例 使用工具 https://github.com/Wsine/feishu2md&#xff0c;提供了…

案例-旋转的太极图案(HTML+CSS)

使用css的动画变换效果完成“ 旋转太极“。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;background-color: antiquewhite;}.tj{width: 0;height: 300px;/* border…

AWTK 开源串口屏开发(4) - 采用数据

AWTK 开源串口屏开发 - 数据采集 1. 功能 数据采集是一个常用的功能&#xff0c;MCU 定时采集数据&#xff08;如环保设备定时采样空气中的污染物&#xff09;&#xff0c;并发送采样数据到串口屏&#xff0c;串口屏可以显示采样数据&#xff0c;也可以对采样数据进行管理&am…

68.乐理基础-打拍子-大附点与变体

上一节内容&#xff1a;66.乐理基础-打拍子-小切分-CSDN博客&#xff0c;只所以没有67因为67可以不用知道&#xff0c;67节内容在&#xff1a;※-打拍子&#xff08;8&#xff09;-一拍内的变体1-乐理教程-腾讯课堂 (qq.com) 大附点&#xff1a;大附点这个名字不是通用的&…

基于element-ui table组件的二次封装

文章目录 配置数据基础分析封装 el-table-column使用插槽强化结语 相信 element-ui 大家都有所耳闻&#xff0c;table 也是老朋友了&#xff0c;不过在使用它的时候大家是怎么使用的呢&#xff1f;是直接在官网上cv使用吗&#xff1f;这种方式&#xff0c;我相信写起来会有点小…

【教学类-43-02】20231226 九宫格数独2.0(n=9)(ChatGPT AI对话大师生成 回溯算法)

作品展示&#xff1a; 背景需求&#xff1a; 大4班20号说&#xff1a;我不会做这种&#xff08;九宫格&#xff09;&#xff0c;我做的是小格子的&#xff0c; 他把手工纸翻过来&#xff0c;在反面自己画了矩阵格子。向我展示&#xff1a; “我会做这种&#xff01;” 原来他…

OCR在审核应用落地

本文字数&#xff1a;6686字 预计阅读时间&#xff1a;35分钟 01 背景 1、业务背景 在传统视频审核场景中&#xff0c;审核人员需要对进审视频中的文字内容进行逐一审核&#xff0c;避免在文字上出现敏感词、违禁词或者广告等相关词汇。这种人工审核费时费力&#xff0c;并且由…

python+django网上购物商城系统o9m4k

语言&#xff1a;Python 框架&#xff1a;django/flask可以定制 软件版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发工具pycharm/vscode都可以 前端框架:vue.js 系统使用过程主要涉及到管理员和用户两种角色&#xff0c;主要包含个…

TSR勾画学习

1&#xff1a;勾画建议 文献&#xff1a;Scoring the tumor-stroma ratio in colon cancer: procedure and recommendations 主要讲述的是结肠癌(CRC)的勾画建议和流程。 1&#xff0c;切片选择建议&#xff1a; 原发肿瘤的载玻片最具侵袭性的部分&#xff08;即常规病理学…

PiflowX组件-ReadFromKafka

ReadFromKafka组件 组件说明 从kafka中读取数据。 计算引擎 flink 有界性 Unbounded 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HOST“”无是逗号分隔的Ka…

【目标检测】yolov8结构及代码分析

yolov8代码:https://github.com/ultralytics/ultralytics yolov8的整体结构如下图&#xff08;来自mmyolo&#xff09;&#xff1a; yolov8的配置文件&#xff1a; # Ultralytics YOLO &#x1f680;, AGPL-3.0 license # YOLOv8 object detection model with P3-P5 outputs.…

偏好对齐RLHF-OpenAI·DeepMind·Anthropic对比分析

OpenAI paper: InstructGPT, Training language models to follow instructions with human feedback paper: Learning to summarize from human feedback Introducing ChatGPT 解密Prompt系列4介绍了InstructGPT指令微调的部分&#xff0c;这里只看偏好对齐的部分 样本构建…

Zookeeper-Zookeeper特性与节点数据类型详解

1.Zookeeper介绍 ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂目容易出错的分布式一致性服务封装起来&#xff0c;构成一高效可靠的原语集&…

Python列表的介绍与操作 增改查,连接,赋值,复制,清空

列表 在日常中我们通过给变量赋值来存储数据,比如 a "hello" b "world" c "你好啊" d "....."由于变量一次只能存储一个数据,但我们如果想一次存储多个数据,的话这样存储会很复杂,所以,我们可以通过列表 列表(List)是Python中的…

Linux驱动开发学习笔记6《蜂鸣器实验》

目录 一、蜂鸣器驱动原理 二、硬件原理分析 三、实验程序编写 1、 修改设备树文件 &#xff08;1&#xff09;添加pinctrl节点 &#xff08;2&#xff09;添加BEEP设备节点 &#xff08;3&#xff09;检查PIN 是否被其他外设使用 2、蜂鸣器驱动程序编写 3、编写测试AP…

基于js和html的骰子游戏

介绍&#xff1a; 1.游戏者选择“大”时&#xff0c;三个骰子点数之和为11-18时&#xff0c;游戏者获胜。2.游戏者选择“小”时&#xff0c;三个骰子点数之和为3-10时&#xff0c;游戏者获胜。3.如果游戏者选择具体点数&#xff0c;则根据三个骰子的点数计算&#xff0c;如果与…

Linux 安装Jupyter notebook 并开启远程访问

文章目录 安装Python安装pip安装Jupyter启动Jupyter Notebook1. 生成配置文件2. 创建密码3. 修改jupyter notebook的配置文件4. 启动jupyter notebook5. 远程访问jupyter notebook 安装Python 确保你的系统上已经安装了Python。大多数Linux发行版都预装了Python。你可以在终端…