C# ?的使用

news/2025/6/13 8:57:42/

栏目总目录


可空类型标记符(?

说明

  • 可空类型标记符?用于指示某个值类型(如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…