C# ?的使用

news/2024/9/15 21:37:13/ 标签: c#, 开发语言

栏目总目录


可空类型标记符(?

说明

  • 可空类型标记符?用于指示某个值类型(如intfloat等)可以为null。这是C# 2.0引入的一个特性,用于处理数据库查询、JSON解析等场景中可能出现的空值。

示例代码

int? nullableInt = 5;
int? nullableIntWithNull = null;if (nullableInt.HasValue)
{Console.WriteLine(nullableInt.Value); // 输出: 5
}if (!nullableIntWithNull.HasValue)
{Console.WriteLine("The value is null."); // 输出: The value is null.
}

空值传播操作符(?.

说明

  • 空值传播操作符?.用于在访问可能为null的对象的成员之前进行空检查。如果对象为null,则不会尝试访问其成员,而是直接返回null

示例代码

string str = null;
int? length = str?.Length; // length 为 null,因为 str 为 nullPerson person = null;
string jobTitle = person?.JobTitle; // jobTitle 为 null,因为 person 为 nullperson = new Person { JobTitle = "Software Engineer" };
jobTitle = person?.JobTitle; // jobTitle 为 "Software Engineer"

条件(三元)运算符(?:

说明

  • 条件运算符?:是C#中的三元运算符,用于根据条件选择两个值之一。其语法为condition ? expression1 : expression2

示例代码

int x = 10;
int y = 5;
int max = x > y ? x : y; // max 为 10Console.WriteLine("最大值: " + max);

空值合并操作符(??

说明

  • 空值合并操作符??用于在第一个操作数为null时返回第二个操作数的值,否则返回第一个操作数的值。这常用于提供默认值以避免null引发的异常。

示例代码

string name = null;
string displayName = name ?? "匿名用户"; // displayName 为 "匿名用户"string username = "DeveloperDave";
displayName = username ?? "Newbie"; // displayName 为 "DeveloperDave",因为 username 不为 nullConsole.WriteLine(displayName);

空值合并赋值运算符(??=

说明

  • 空值合并赋值运算符??=是C# 8.0及更高版本中引入的一个特性,它结合了空值合并运算符(??)和赋值运算符(=)的功能。这个运算符用于将右侧的值赋给左侧的变量,但仅当左侧的变量为null时。如果左侧的变量不为null,则不会更改其值。这提供了一种更简洁的方式来为可能为null的变量提供默认值或更新它们的值,而无需编写额外的if语句。

示例代码

string firstName = null;
firstName ??= "未知"; // 如果 firstName 是 null,则将其设置为 "未知"
Console.WriteLine(firstName); // 输出: 未知firstName = "John";
firstName ??= "未知"; // firstName 不是 null,所以不会更改其值
Console.WriteLine(firstName); // 输出: John// 示例使用可空类型
int? age = null;
age ??= 30; // 如果 age 是 null,则将其设置为 30
Console.WriteLine(age.HasValue ? age.Value.ToString() : "null"); // 输出: 30age = 25;
age ??= 30; // age 不是 null,所以不会更改其值
Console.WriteLine(age.HasValue ? age.Value.ToString() : "null"); // 输出: 25// 示例使用类对象的属性
Person person = null;
person ??= new Person { Name = "默认名称" }; // 如果 person 是 null,则创建新实例并赋值
if (person != null)
{Console.WriteLine(person.Name); // 如果 person 是新创建的实例,则输出: 默认名称
}person = new Person { Name = "John Doe" };
person.Name ??= "默认名称"; // person.Name 不是 null,所以不会更改其值
Console.WriteLine(person.Name); // 输出: John Doe

在上面的示例中,??= 运算符首先检查左侧的变量(或属性)是否为null。如果是,则将其设置为右侧的值;如果不是,则保持其当前值不变。这种操作对于初始化可能为null的变量或在某些条件下更新它们非常有用。

请注意,最后一个示例中尝试使用??=来更新Person对象的Name属性可能不会按预期工作,因为??=是专门为变量赋值设计的,而不是用于属性的。在属性上使用??=会导致编译错误,除非该属性是特殊的(如可空值类型的自动实现属性)。


http://www.ppmy.cn/news/1505049.html

相关文章

深入研究Java的String常量池

文章目录 一、StringTable分析一段代码示例一示例二示例三 二、 intern1、StringTable位置2、StringTable 性能调优3、intern深入分析3.1 思考3.2 JDK6中的解释3.3 JDK7中的解释3.4 详细分析3.5 intern正确使用的例子3.6 intern使用不当的例子 一、StringTable 常量池中的字符…

PatchCore:工业异常检测中的全面召回

PatchCore:工业异常检测中的全面召回 前言相关介绍PatchCore的工作原理:优点:缺点: 实验环境项目地址LinuxWindows 项目结构具体用法准备数据进行训练进行测试 常见问题ModuleNotFoundError: No module named patchcore解决方法 O…

[PM]面试题-综合问题

思维题 说说当前的科技行业 web3是我比较感兴趣的方向, 在国内还处于起步阶段, web3重要的特点是去中心化, 依赖的技术有以太坊, 区块链, 智能合约, 现在位置还没有特别成熟的产品形态, 发展的比较好的方向就是数字藏品和游戏方向 列举一个你认为比较好的APP, 说明其独特之处…

一则悬空指针案例

int* foo() {int a; // 变量a的作用域开始a 100;char *c "xyz"; // 变量c的作用域开始return &a; } // 变量a和c的作用域结束先来看这样一段代码。这段代码虽然可以编译通过,但是其实非常糟糕,变量 a 和 c…

【linux运维】大型文件查询特定字符串方案总结(如2GB的文本文件)

对于大型文件(如2GB的文本文件),直接使用 grep 或其他文本处理工具可能会消耗大量的内存资源。为了更高效地处理这种情况,可以采用以下几种策略: 1. 使用 grep 的性能优化 尽管 grep 是非常高效的工具,但…

Unity复制对象时让私有变量也被复制的简单方法

Unity复制对象时,如果一个变量为公共变量(public),那么这个变量的值会被复制到新的对象中去,但是如果一个变量是私有变量(private),默认是不会被复制的,如果希望被复制&a…

pytorch学习笔记5 tensor 广播broadcasting

不同shape直接加减,系统会自动做broadcasting操作 先右对齐(小维度对齐) 比如:Feature maps: [4,32,14,14] Bias:[32,1,1] >][1,32,1,1] >[4,32,14,14] 做到与Feature maps的shape相同,才…

【Vulnhub系列】Vulnhub Connect-The-Dots 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub Connect-The-Dots靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or…

C++选择题带答案

(1) 若变量已正确定义并赋值,表达式____不符合C语言语法。 A) a*b/c; B) 3.14%2 C) 2, b D) a/b/c (2) _____是不正确的字符常量。 A)ˊnˊ B) ˊ1ˊ C)"a" D) ˊ101ˊ (3) 在 C 程序中&#xf…

【Python学习手册(第四版)】学习笔记14-迭代器和列表解析(一)

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文主要以通俗易懂的语言介绍迭代器(文件迭代、手动迭代iter和next等),列表解析式包括基础知识包括写法、文件上使用列表解析…

STL-stack容器适配器

目录 一、容器适配器 二、使用 三、模拟实现 一、容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 STL中,stack是由dequ…

sql注入时,waf屏蔽了information_schema如何处理?

information_schema可代替库 如果使用正则表达式屏蔽了information,则想一想有没有能代替的information的库。 例如:x$schema_table_statistics这个库里面就有table_schema和table_name,但是没有列名,那么列名就需要使用无列名注…

基于FPGA的数字信号处理(20)--半减器和全减器

目录 1、前言 2、半减器 3、全减器 4、减法器 文章总目录点这里:《基于FPGA的数字信号处理》专栏的导航与说明 1、前言 既然有半加器和全加器,那自然也有半减器和全减器了。尽管在电路中减法的实现基本都是 补码 加法 的形式,但是正所谓…

RK3568笔记五十一:W25Q64测试(spi 标准接口 )

若该文为原创文章,转载请注明原文出处。 前面有测试过W25Q64,但那是自己编写的驱动,现在使用内核自带的驱动,只需要通过SPI标准接口,编写应用程序即可以读写W25Q64. 一、硬件原理图 SPI 引脚 功能 MOSI GPIO3_C1 …

LeetCode——572. 另一颗树的子树

通过万岁!!! 题目:给你两棵树,然后问subRoot是不是root的子树。也就是root某个节点的所有孩子节点在值和结构上完全与subRoot相同。思路:我的思路比较简单,就是遍历root,遇到root中…

【vulnhub】Zico2靶机

信息收集 靶机IP发现 进行端口扫描,发现开放了22(ssh),80(http)和111(rpcbind)端口。 进行目录扫描 dirsearch -u http://192.168.93.152 网址IP访问 后面拼接/dbadmin/目录 用弱口…

HarmonyOS鸿蒙应用开发之Text组件的使用

文章目录 示例代码说明Text组件常用属性1. 文本内容2. 字体样式3. 文本对齐4. 布局与边距5. 文本截断与换行6. 其他属性 对比Android的TextView1.基本概念2.属性对比3.小结 注意事项 Text组件在ArkTS中的用法非常灵活,可以通过代码动态地设置文本内容、样式等属性。…

深入理解Shell中的`echo`命令

在Shell脚本编程中,echo命令是最基本的命令之一,用于向终端输出文本。然而,echo的用途远不止于此。本文将深入探讨echo命令的多种用法,包括打印命令执行结果和控制命令执行流程。 echo命令基础 echo命令用于在终端输出字符串或变…

[kimi笔记].net平台

.NET 是一个由微软公司开发的软件开发平台,它的历史可以追溯到2000年左右。.NET 框架最初是为Windows操作系统设计的,但随着时间的发展,微软逐步扩展了.NET 的应用范围,使其可以在多个平台上运行。以下是.NET 几个平台的历史和平台…

简单搭建dns服务器

目录 一.安装服务 二.编写子配置文件 三.编写主配置文件 四.编写文件 五.重启服务测试 配置端:IP地址为172.25.254.100、主机名为node1.rhel9.org 测试端:IP地址为172.25.254.101、主机名为node2.rhel9.org 一.安装服务 [rootnode1 ~]# dnf inst…