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

http://www.lryc.cn/news/416103.html

相关文章:

  • 【unity小技巧】unity性能优化以及如何进行性能测试
  • 算法参考改进点/知识点
  • electron 配置、打包 -报错解决
  • 基于STM32设计的智能鱼缸(华为云IOT)(200)
  • Django与数据库
  • 大数据系列之:CentOS7安装R详细步骤
  • Linux学习第57天:Linux PWM驱动实验
  • git 远程拉取指定文件
  • 【css】 CSS3+JS做一个酷炫的仪表进度条3d进度条
  • uniapp小程序全局配置分享到朋友和朋友圈功能的实现
  • Java优化后台分页
  • <数据集>电梯内人车识别数据集<目标检测>
  • 二百五十三、OceanBase——Linux上安装OceanBase数据库(三):OBD页面上部署OceanBase数据库
  • Redis应用笔记
  • html实现好看的塔罗牌、十二星座运势网站源码
  • 万字长文带你入门shell编程(超详细)
  • 音质提升秘籍:专业音频剪辑软件汇总
  • idea配置
  • 将 WinForms 中的 Panel 替换为 WPF 的 WindowsFormsHost 元素
  • C++ ---- vector的底层原理剖析及其实现
  • 跑酷视频素材去哪里下载?哪里有跑酷游戏视频素材?
  • Centos 7配置问题
  • 浮动IP(Floating IP)计费;OpenStack算力共享;OpenStack实现资源虚拟化;算力调度策略
  • Android 源码单独编译Settings模块
  • 虚拟机类加载机制
  • Google Earth Engine(GEE)——逐月筛选影像,并给影像集合添加新的属性
  • 如何从智联招聘网站快速抓取职位详情?两大技巧揭秘
  • C#知识|ini文件操作
  • Linux系统学习之路
  • DNS介绍与部署-Day 01