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.hqwc.cn/news/310566.html

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

相关文章

关于“Python”Django 管理网站的核心知识点整理大全52

目录 注意 18.2.2 激活模型 settings.py 18.2.3 Django 管理网站 1. 创建超级用户 注意 2. 向管理网站注册模型 admin.py 注意 3. 添加主题 Climbing。 18.2.4 定义模型 Entry models.py 18.2.5 迁移模型 Entry 18.2.6 向管理网站注册 Entry admin.py 往期快速…

fastjosn利用分析

fastjosn一般是使用TemplatesImpl链来进行攻击的&#xff0c;在上面其实已经分析过fastjson在反序列化的时候会调用满足条件的getter方法&#xff0c;因此就会调用TemplatesImpl类的getOutputProperties方法&#xff0c;然后通过getOutputProperties&#xff0c;调用newTransfo…

Qt QAction添加图片

QAction用的时候&#xff0c;时常需要添加图片&#xff0c;如上图所示&#xff0c;代码如下所示&#xff1a; 测试的图片格式包含png,jpg,bmp,svg&#xff0c;其他未测试

Solidworks学习笔记

本内容为solidworks的学习笔记&#xff0c;根据自己的理解进行记录&#xff0c;部分可能不正确&#xff0c;请自行判断。 学习视频参考&#xff1a;【SolidWorks2018视频教程 SW2018中文版软件基础教学知识 SolidWorks自学教程软件操作教程 sw视频教程 零基础教程 视频教程】 h…

【GOLANG】使用插件 Goanno 的方式来对方法、接口、结构体注释模板配置

直接 使用插件 Goanno 的方式来对方法、接口、结构体注释模板配置 1、简单安装 Goanno 插件 File->Settings->Plugins , 搜索 Goanno Normal Method 配置内容如下&#xff1a; // Title ${function_name} // Description ${todo} // Author mumu ${date} ${time} // Par…

Ps:亮度蒙版 - 多层级 Alpha 通道方法

本文主要介绍创建高光、阴影、中间调选区的方法&#xff0c;并可基于它们创建更多层级的 Alpha 通道&#xff0c;从而根据需要自由地创建亮度蒙版。 应用视频演示 以下方法中&#xff0c;依据高光、阴影及中间调各创建三个层次的 Alpha 通道&#xff0c;总共九个 Alpha 通道可用…

华为交换机生成树STP配置案例

企业内部网络怎么防止网络出现环路&#xff1f;学会STP生成树技术就可以解决啦。 STP简介 在二层交换网络中&#xff0c;一旦存在环路就会造成报文在环路内不断循环和增生&#xff0c;产生广播风暴&#xff0c;从而占用所有的有效带宽&#xff0c;使网络变得无法正常通信。 在…

探索 Pinia:简化 Vue 状态管理的新选择(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

HackTheBox - Medium - Linux - Interface

Interface Interface 是一种中等难度的 Linux 机器&#xff0c;具有“DomPDF”API 端点&#xff0c;该端点通过将“CSS”注入处理后的数据而容易受到远程命令执行的影响。“DomPDF”可以被诱骗在其字体缓存中存储带有“PHP”文件扩展名的恶意字体&#xff0c;然后可以通过从其…

24、Web攻防-通用漏洞SQL注入MYSQL跨库ACCESS偏移

文章目录 一、SQL注入原理   脚本代码在与数据库进行数据通讯时&#xff08;从数据库取出相关数据进行页面显示&#xff09;&#xff0c;使用预定义的SQL查询语句进行数据查询。能通过参数传递自定义值来实现SQL语句的控制&#xff0c;执行恶意的查询操作&#xff0c;例如查询…

(001)Unit 编译 UTF8JSON

文章目录 编译 Dll编译报错附录 编译 Dll 新建工程&#xff1a; 注意 UnityEngineDll 的选择&#xff01;2022 版本的太高了&#xff01;&#xff01;&#xff01; 下载包&#xff0c;导入unity : 3. 将 unf8json 的源码拷贝到新建的工程。 4. 编译发布版本&#xff1a; 编译…

每日一练:LeeCode-20. 有效的括号(简)【栈】

本文是力扣LeeCode-20. 有效的括号 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0…