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

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属性可能不会按预期工作,因为??=是专门为变量赋值设计的,而不是用于属性的。在属性上使用??=会导致编译错误,除非该属性是特殊的(如可空值类型的自动实现属性)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 目标检测——X光安检数据集
  • 快速上手的企业视频会议系统需要具备哪些能力
  • 魔众文库系统v7.0.0版本推荐店铺功能,管理菜单逻辑优化
  • 【leetcode刷题之路】面试经典hot100(1)——哈希+双指针+滑动窗口+子串
  • HTMLCSS
  • 面试官:怎样设计一个分布式任务调度平台?
  • 【开源分享】PHP在线提交工单源码|工单管理系统源码 (附源码搭建教程)
  • STM32——外部中断(EXTI)
  • 【云原生】Job一次性任务详解
  • xss漏洞(二,xss靶场搭建以及简单利用)
  • 关于使用webflux开发思考
  • Animate软件基本概念:遮罩层和引导层
  • 【Python】解决Yolov8训练时,“OSError: [WinError 1455] 页面文件太小,无法完成操作”错误
  • [自学记录09*]关于模糊效果降采样优化性能的小实验
  • 【异常】npm install 出错几种解决方案
  • gf框架之分页模块(五) - 自定义分页
  • Linux后台研发超实用命令总结
  • Material Design
  • Python 基础起步 (十) 什么叫函数?
  • React-Native - 收藏集 - 掘金
  • SpiderData 2019年2月23日 DApp数据排行榜
  • storm drpc实例
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • XML已死 ?
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 面试总结JavaScript篇
  • ionic异常记录
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)bark-ml
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C#)一个最简单的链表类
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (规划)24届春招和25届暑假实习路线准备规划
  • (四)opengl函数加载和错误处理
  • (四)汇编语言——简单程序
  • (算法二)滑动窗口
  • .net core使用ef 6
  • .NET Core中Emit的使用
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 后台导出excel ,word
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net 应用中使用dot trace进行性能诊断
  • .NET 指南:抽象化实现的基类
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • /bin/rm: 参数列表过长"的解决办法