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

相关文章:

C# ?的使用

栏目总目录 可空类型标记符(?) 说明: 可空类型标记符?用于指示某个值类型(如int、float等)可以为null。这是C# 2.0引入的一个特性,用于处理数据库查询、JSON解析等场景中可能出现的空值。 示例代码&am…...

【unity小技巧】unity性能优化以及如何进行性能测试

文章目录 前言GPU性能优化打包素材 CPU性能优化代码执行优化 性能测试Vector2.Distance 和 sqrMagnitude哪个好?动画切换优化shader属性优化 URP渲染器资产优化对象池优化删除没必要的空函数图片、音乐音效、贴图等素材压缩ScriptableObject优化参数参考完结 前言 …...

算法参考改进点/知识点

1、clip文章中改进点 图像编码器image encoder: 将全局平均池化层替换为注意力池化机制。注意力池化机制:通过一个单层的“transformer式”多头QKV注意力,其中查询query是基于图像的全局平均池表示。改进VIT(Vision Transformer…...

electron 配置、打包 -报错解决

目录 一、配置途中遇到的问题: 二、 make 配置好后开始打包 三、Electron-builder 打包报错 一、配置途中遇到的问题: 1. 安装 yarn add electron -D 一直卡在这里失败 一直卡可以使用下面这个,然后再重新装依赖 1. 采用新的镜像地址 npm …...

基于STM32设计的智能鱼缸(华为云IOT)(200)

文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置【3】自动换水原理1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献1.4 开发工具的选择【1】设备端开发【2】上位…...

Django与数据库

目录 创建项目app 路由子表 数据库 创建数据库 什么是ORM 定义数据库表 Django Admin 管理数据 过滤条件 代码直接生成HTML 使用模板 前后端分离架构 对资源的增删改查处理 列出客户 添加客户 临时取消 CSRF 校验 修改客户信息 删除客户 Django中ORM的处理 数据模…...

大数据系列之:CentOS7安装R详细步骤

大数据系列之:CentOS7安装R详细步骤 一、下载R二、解压R三、创建安装目录四、指定安装目录五、安装编译依赖六、编译与编译安装七、设置环境变量八、激活环境变量九、执行R命令十、执行demo测试程序 一、下载R wget https://cran.r-project.org/src/base/R-4/R-4.4…...

Linux学习第57天:Linux PWM驱动实验

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图如下: 一、PWM驱动简析 1、设备树下的PWM控制节点 8 路 PWM 都属于 I.MX6ULL 的 AIPS-1 域,分为了两部分, PWM1~P…...

git 远程拉取指定文件

指定操作 git init 创建一个空的文件 git remote add orgin 远程仓库地址链接 表示添加远程库的地址 git config core.sparsecheckout true 打开sparsecheckout功能 注意:如果需要分支内所有文件,这个指令可以直接过忽略,则会拉取对应分支所有的文件…...

【css】 CSS3+JS做一个酷炫的仪表进度条3d进度条

创建一个动态进度环组件 在现代网页设计中,进度环是一种常见的视觉元素,用于展示任务的完成度或加载状态。本文将介绍如何使用Vue.js和Less创建一个动态进度环组件,该组件不仅具有美观的视觉效果,还能够根据用户输入动态改变颜色…...

uniapp小程序全局配置分享到朋友和朋友圈功能的实现

文章目录 1.创建/mixins/share.js插件2.全局配置3.编写share.js4.调用5.分享成功 1.创建/mixins/share.js插件 直接创建 2.全局配置 (1)找到main.js在下面引入share.js文件 (2)使用mixins混入vue中,这样就相当于在每一…...

Java优化后台分页

第一种情况&#xff1a;先查询出所有记录&#xff0c;再进行分页处理&#xff08;分页中可以异步处理&#xff09; 优化前&#xff1a; List<String> list Arrays.asList("1","2","3","4","5","6","…...

<数据集>电梯内人车识别数据集<目标检测>

数据集格式&#xff1a;VOC格式 图片数量&#xff1a;97张 标注数量(xml文件个数)&#xff1a;97 标注类别数&#xff1a;3 标注类别名称&#xff1a; [person, motorcycle, bicycle] 序号类别名称图片数框数1person891322motorcycle78793bicycle2222 使用标注工具&#…...

二百五十三、OceanBase——Linux上安装OceanBase数据库(三):OBD页面上部署OceanBase数据库

一、目的 安装OceanBase后&#xff0c;启动obd web&#xff0c;需要在OBD页面上部署OceanBase数据库 二、参考文档 http://t.csdnimg.cn/Qeedq 三、实施步骤 1 在obadmin用户下&#xff0c;启动obd服务&#xff0c;登录页面访问 [obadminhurys23 oceanbase]$ obd web 2 登…...

Redis应用笔记

Redis应用笔记 一、 前言二、 Redis八种常用数据类型2.1 Redis的五种基本数据类型2.2 Redis的三种特殊数据类型 三、发现Redis热Key方案3.1 使用 Redis 自带的 --hotkeys 参数来查找3.2 使用MONITOR 命令3.3 借助开源项目 四、解决 hotkey五、Redis 内存碎片5.1 为何会有Redis …...

html实现好看的塔罗牌、十二星座运势网站源码

文章目录 1.设计来源1.1 十二星座1.2 所有界面效果图 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…...

万字长文带你入门shell编程(超详细)

一、概述 Shell 是计算机操作系统中用户与操作系统内核之间的接口层&#xff0c;它提供了一种方式让用户能够通过命令行界面&#xff08;CLI&#xff09;与操作系统交互。Shell 可以被视为一个命令解释器&#xff0c;它接收用户输入的命令&#xff0c;解析这些命令&#xff0c…...

音质提升秘籍:专业音频剪辑软件汇总

现在欣赏传输音频文件比以前简单多了&#xff0c;这些音频的质量也影响了听众的体验与感受。所以使用一些靠谱的音频剪辑工具处理音频能让你的音频文件呈现更好的效果。 1.福昕音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ 这是一款电脑端软件。别看…...

idea配置

在我们使用idea的时候会进行配置主要就idea编译器的下载&#xff0c;maven资源管理器&#xff0c;Tomcat服务器 在IntelliJ IDEA的官网进入http://www.jetbrains.com/idea/ 如图如果你是大学生的话一般学校会有相关的激活码直接选择左边的.exe文件下载&#xff0c;直接的就是企…...

将 WinForms 中的 Panel 替换为 WPF 的 WindowsFormsHost 元素

要将 WinForms 中的 Panel 替换为 WPF 的 WindowsFormsHost 元素&#xff0c;你需要执行以下步骤&#xff1a;1. 添加对 WindowsFormsIntegration 的引用&#xff1a;确保你的项目引用了 WindowsFormsIntegration 和 PresentationCore、PresentationFramework 程序集&#xff0…...

DeepSeek代码质量评估实战手册:7步完成从混沌到可度量的质变跃迁

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek代码质量评估的底层逻辑与核心价值 DeepSeek代码质量评估并非简单地统计行数或检测语法错误&#xff0c;而是基于多维语义理解构建的推理系统。其底层逻辑融合了静态分析、符号执行与大语言模型生成式…...

作业本耐用度差距巨大?深圳大明印刷厂拆解合规工艺,告别定制作业本掉页开裂通病

在校园日常教学中&#xff0c;很多学校都会遇到同一个难题&#xff1a;同一学期采购的作业本、定制作业本&#xff0c;品质差距悬殊&#xff0c;有的完好无损用到期末&#xff0c;有的短短几周就出现书脊开裂、页面脱落、边角破损、翻页卡顿等问题。不少人误以为是学生使用习惯…...

用STM32CubeMX和HAL库快速上手WS2812B:告别手动计算延时,一键生成驱动框架

基于STM32CubeMX的WS2812B智能灯光控制&#xff1a;从零构建现代化驱动方案在智能硬件和物联网设备快速发展的今天&#xff0c;WS2812B可编程LED灯带因其丰富的色彩表现和简单的单线控制方式&#xff0c;成为创客和工程师们最喜爱的显示组件之一。然而&#xff0c;传统的寄存器…...

对称与负电源测试:动态直流电子负载的设计、原理与应用

1. 项目概述&#xff1a;对称与负电源的静态与动态直流负载在电子实验室里&#xff0c;测试一个电源的性能&#xff0c;尤其是它的动态响应能力&#xff0c;是件既基础又关键的事。我们常说的“直流电子负载”就是这个领域的核心工具。我之前设计并分享过一个用于正电源测试的静…...

巧用对称性与平均值原理:低成本实现高精度电阻分压器校准

1. 项目概述&#xff1a;用数学思维突破测量设备的精度极限在电子实验室里捣鼓精密电路&#xff0c;尤其是涉及到电压基准、信号调理或者高精度ADC前端时&#xff0c;一个绕不开的坎就是精密分压器。你可能在设计一个需要0.1%甚至更高精度的分压网络&#xff0c;但手头的万用表…...

Unity动态自然系统:Forest Environment-Dynamic Nature深度解析

1. 这不是“贴图堆砌”&#xff0c;而是自然系统级建模&#xff1a;Forest Environment-Dynamic Nature 的真实定位你有没有试过在Unity里拖进几棵树、铺点草、加个天空盒&#xff0c;然后发现场景像一张静止的风景明信片——风不动、叶不摇、雨不落、雾不散&#xff1f;我做过…...

CPU架构启发的智能仓储布局优化实践

1. 仓库布局优化的核心挑战与创新机遇在物流仓储领域&#xff0c;拣货环节通常占据运营成本的55%-65%&#xff0c;而其中约50%的时间消耗在无效行走路径上。传统矩形仓库布局虽然易于规划和施工&#xff0c;但其正交的通道设计导致拣货员需要频繁进行90度转向&#xff0c;这种&…...

全球无障碍宣传日:iOS 26 辅助功能大升级,这些实用小功能你用过吗?

辅助功能发展与升级很多人对辅助功能的印象还停留在 "小白点"&#xff0c;但随着 iPhone 进入全面屏时代&#xff0c;它逐渐变得陌生。实际上&#xff0c;Apple 每年都会为其增添功能&#xff0c;方便身体有障人士使用 iPhone。而且&#xff0c;这些功能不仅惠及有障…...

告别杂乱!用FileMenu Tools 8.4.2一键清理Windows 11右键菜单(附隐藏技巧)

Windows 11右键菜单精简指南&#xff1a;用FileMenu Tools打造高效工作流每次在文件上点击右键时&#xff0c;那个缓慢弹出的冗长菜单是否让你感到烦躁&#xff1f;随着安装的软件越来越多&#xff0c;Windows的右键菜单往往会变得臃肿不堪&#xff0c;严重影响工作效率。今天&…...

如何快速掌握MPC视频渲染器:面向初学者的完整教程

如何快速掌握MPC视频渲染器&#xff1a;面向初学者的完整教程 【免费下载链接】VideoRenderer Внешний видео-рендерер 项目地址: https://gitcode.com/gh_mirrors/vi/VideoRenderer 想要在Windows系统上获得影院级的视频播放体验吗&#xff1f;MPC…...