C#基础-空处理
在c#中,值对象是没有办法赋值为null的。比如说,你想要定义一个布尔值,你的赋值数据要么得是true、要么就得是false,默认情况下我们永远没可能给这个布尔赋值为null,即使只是对这个变量进行声明而不初始化数据,c#编译器也会给他在声明的同时赋予默认的初始化数据。布尔的初始化数据为false,整数、浮点数为0。
不过,在实际工作中,我们难免会遇到需要给值类型对象赋值为null的情况。比如说,我们在数据库有个客户列表,保存了客户的姓名、电话、出生日期等数据,而出生日期不是必选项,所以,在数据库中有可能存在客户没有留下生日的情况。
出生日我们需要使用DateTime类型来处理,但是DateTime类型在c#中是值类型对象(struct),没有办法赋值为null。所以,对于没有出生日期的情况,反应在代码中我们就需要给DateTime做一些特殊处理,让他可以赋值为null了。
一、Nullable
C#为类似上述情况提供的专门进行空处理的可空类型Nullable,位于system命名空间中。
1、Nullable的使用
可空类型的创建:
Nullable的使用方式很简单,以DateTime为例,在Nullable后面加上箭头括号,泛型为DateTime。现在,我们的date变量就可以被设置为null了。
Nullable<DateTime> date = null;
因为可控类型很常用,因此c#还很贴心得给这种类型设计了独特的语法接口,通过语法糖来简化代码。
DateTime? date = null;
2、Nullable的常用成员
bool HasValue:Nullable类型的属性成员,用于判断是否为空。
T Value:Nullable类型的属性成员,返回承载当前值的对应类型对象,如果为null则抛出异常。
T GetValueOrDefault():Nullable类型的方法成员,当为null时,返回承载默认值的对应类型对象,当不为null时候,返回承载当前值的对应类型对象。
class Program
{static void Main(string[] args){DateTime? date = null;Console.WriteLine(date.GetValueOrDefault());date = new DateTime(2022, 1, 2);if (date.HasValue){Console.WriteLine(date.Value);}}
}

注意:不能把一个Nullable的Datetime直接赋值给普通的Datetime,因为他们两者的类型是截然不同的,c#编译器不知道应该怎么处理这种情况。
二、合并运算符 ??
现在假设有一个需求,打印Nullable<DateTime>变量date的日期,但有个要求,就是只有date有数据的时候,才显示date的日期;否则显示今天的日期。如果不使用合并运算符,一般会写成如下代码:
static void Main(string[] args)
{DateTime? date = null;if (date != null){Console.WriteLine(date.GetValueOrDefault());}else{Console.WriteLine(DateTime.Today);}
}
在实际工作中,我们有大量的代码都需要做类似的处理,先进行非空判断,然后再执行逻辑。不过,这坨代码其实很啰嗦,对于可空数据的处理,c#提供了一个非常强大的语法结构进行处理,就是连续使用两个问号,即合并运算符??。
语法:变量a ?? 变量b/表达式
连续两个问号是Coalescing Operator,中文叫做合并运算。这是一个逻辑操作符,当左侧的变量为null时,他将会返回合并操作符右侧数据,否则合并操作将会提取左侧的变量的真实数据,并且返回这个数据。于是,上面的代码就可以简写为:
static void Main(string[] args)
{DateTime? date = null;var result = date ?? DateTime.Today;Console.WriteLine(result);
}
相关文章:
C#基础-空处理
在c#中,值对象是没有办法赋值为null的。比如说,你想要定义一个布尔值,你的赋值数据要么得是true、要么就得是false,默认情况下我们永远没可能给这个布尔赋值为null,即使只是对这个变量进行声明而不初始化数据ÿ…...
测试平台开发vue组件化重构前端代码
基于 springbootvue 的测试平台开发 继续更新(人在魔都 T_T)。 这期其实并不是一个详细的开发过程记录,主要还是针对本次前端重构来聊聊几个关注点。 目前重构的总进度在80%,重构完的页面没什么变化,再回顾一下。 一…...
龍运当头--html做一个中国火龙祝大家龙年大吉
🐉效果展示 🐉HTML展示 <body> <!-- partial:index.partial.html --> <svg><defs><g id=...
Dockerfile语法和简单镜像构建
Dockerfile是一个用于定义Docker镜像的文本文件,包含了一系列的指令和参数,用于指示Docker在构建镜像时应该执行哪些操作,例如基于哪个基础镜像、复制哪些文件到镜像中、运行哪些命令等。 Dockerfile文件的内容主要有几个部分组成,…...
uniapp使用wxml-to-canvas开发小程序保存canvas图片
微信小程序官方解决方案:wxml-to-canvas 使用wxml-to-canvas要知道一些前提条件 1、只能画view,text,image 2、每个元素必须要设置宽高 3、默认是flex布局,可以通过flexDirection: "column"来改变排列方式 4、文字 必…...
关于数据库切换的麻烦
背景介绍 现项目使用了两个数据源,分别为A、B,两个数据库的数据结构并不相同,数据库A是用来做查询一些基本信息的,数据库B是用来保留业务操作数据的。后端是在mapper层用DS注解来区分哪些地方用数据库A,而哪些地方用数…...
Qt/QML编程学习之心得:Linux下读写文件File(24)
在Linux嵌入式系统中,经常会使用Qt来读写一个文件,判断一个文件是否存在,具体如何实现呢? 首先,要使用linux系统中相关的头文件: #include <unistd.h> #include <stdio.h> #include <stdlib.h> 其次,判断路径是否存在, if(!dir.exists()){mkdir(…...
【Vue2+3入门到实战】(22)VUE3之组合式API - setup、reactive和ref函数、computed、watch、生命周期函数详细讲解
目录 一、组合式API - setup选项1. setup选项的写法和执行时机2. setup中写代码的特点3. <script setup>语法糖 二、组合式API - reactive和ref函数1. reactive2. ref3. reactive 对比 ref 三、组合式API - computed四、组合式API - watch1. 侦听单个数据2. 侦听多个数据…...
如何在互联网上找到你想要的数据?
互联网时代,信息爆炸,怎么在网上查到到自己想要的信息已经变难了。毕竟经常搜索的内容前几页都是广告。 那么如何在大量的广告和垃圾信息中获取到自己想要的信息呢? 首先,明确自己的需求,比如你想找哪个方面的数据,…...
揭秘淘宝商品详情API如何助力电商创新发展
淘宝商品详情API是淘宝开放平台提供的一种数据接口服务,能够获取到淘宝网商品详情的各种信息,包括商品标题、价格、销量、评价等。通过淘宝商品详情API,开发者可以轻松地获取到这些数据,并利用这些数据进行商业分析和应用开发。 …...
vue element plus Space 间距
虽然我们拥有 Divider 组件,但很多时候我们需要不是一个被 Divider 组件 分割开的页面结构,因此我们会重复的使用很多的 Divider 组件,这在我们的开发效率上造成了一定的困扰。 间距组件就是为了解决这种困扰应运而生的。 基础用法# 最基础…...
【驱动序列】C#获取电脑硬件之CPU信息,以及它都有那些品牌
欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是是《驱动序列》文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识…...
目标检测-One Stage-YOLO v3
文章目录 前言一、YOLO v3的网络结构和流程二、YOLO v3的创新点总结 前言 根据前文目标检测-One Stage-YOLOv2可以看出YOLOv2的速度和精度都有相当程度的提升,但是精度仍较低,YOLO v3基于一些先进的结构和思想对YOLO v2做了一些改进。 提示:…...
安泰ATA-4014高压功率放大器在传感器脉冲涡流检测中的应用
传感器在工程领域起着至关重要的作用,能够实时获取各种物理量的信息。而功率放大器作为传感器信号处理的重要组成部分,广泛应用于各种测量和控制系统中。本文将探讨功率放大器在这一领域的重要性和作用。 首先,了解传感器脉冲涡流检测的基本原…...
Axure全面指南:正确打开并高效使用的步骤!
AxureRP是目前流行的设计精美的用户界面和交互软件。AxureRP根据其应用领域提供了一组丰富的UI控制。作为Axure的国内替代品,即时设计可以在线协作,浏览器可以在无需下载客户端的情况下打开和使用。如果以前使用Axure,很容易切换到即时设计。…...
ts axios 指定返回值类型,返回数据类型不确定该怎么办 typescript
ts axios 指定返回值类型,返回数据类型不确定该怎么办 typescript 转到 ts 以来,一直有个问题困扰着我,就是每次用 axios 获取数据时,返回值 res 的类型都不能确定,这就导致编辑器一直提示我: 原因 原因是…...
判断是否是json字符串
一、在isJson.js文件里创建一个isJson类并抛出 /*** isJson 类用于判断一个字符串是否为有效的 JSON 字符串。* class isJson* param {string} str - 要判断的字符串。* returns {boolean} 如果字符串是有效的 JSON 字符串,则返回 true;否则返回 false。…...
SpringBoot集成Minio(接上文)
如果启动项目出现下面错误,把minio的版本更换为低版本的,我最初用的是8.5.7版本的出现下面错误,后面一直调低版本发现8.2.2,8.3.0都是可以的。(因为我需要用8.5.7的版本所以调了别的依赖的版本,大家可以根据…...
更新 torchtext 造成的torch版本不匹配的问题
更新 torchtext 造成的torch版本不匹配的问题 - pip 原来的版本配置 cuda11.6 torch-GPU 1.13.1 如果直接pip update torchtext 会卸载原来的torch然后默认安装CPU版本,很烦。网上的各种方法都是推荐conda.但是我一直都是pip。因此考虑pip 的解决办法。 解决办…...
flutter资源
开发者平台 腾讯云 https://cloud.tencent.com/developer/article/1902681 掘金 stackoverflow 个人博主 Magic旭 https://www.jianshu.com/u/f9b0b77d6038 J船长 https://juejin.cn/user/1820446987136903/posts 老孟 http://www.laomengit.com/flutter/widgets/Theme.html#t…...
解决每次打开JFlash就提示:Device: TLE9863QXW20: Flash bank 0x11000000: No loader specified的问题
问题现象:每次打开JFlash就提示: Device: TLE9863QXW20: Flash bank 0x11000000: No loader specified解决方法:1.WinR 输入以下 打开目录:%APPDATA%\SEGGER\JLinkDevices2.文本打开xml文件:我是打开华大(HDCS)芯片的时…...
MediaCreationTool.bat:5大实用功能带你告别Windows安装烦恼
MediaCreationTool.bat:5大实用功能带你告别Windows安装烦恼 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...
从‘一片蓝’到‘五彩斑斓’:手把手教你美化Matlab三维柱状图,让论文图表脱颖而出
从‘一片蓝’到‘五彩斑斓’:科研级Matlab三维柱状图视觉优化全攻略 当审稿人翻开一篇论文时,图表往往是他们最先注意到的元素。我曾参与过多次学术期刊的评审工作,那些配色考究、细节精致的图表总能在第一时间抓住眼球——这不仅仅是审美问题…...
从零到一:翁恺C语言MOOC实战习题精解与编程思维构建
1. 为什么选择翁恺老师的C语言课程? 作为国内最受欢迎的编程入门课程之一,翁恺老师在MOOC平台上的C语言课程已经帮助超过百万学习者打开了编程世界的大门。我当年自学C语言时,也是从这套课程起步的。与其他课程相比,翁老师的教学有…...
如何5步掌握ComfyUI MixLab插件:打造专业AI创作工作流的完整指南
如何5步掌握ComfyUI MixLab插件:打造专业AI创作工作流的完整指南 【免费下载链接】comfyui-mixlab-nodes Workflow-to-APP、ScreenShare&FloatingVideo、GPT & 3D、SpeechRecognition&TTS 项目地址: https://gitcode.com/gh_mirrors/co/comfyui-mixla…...
别再乱插拔了!一文搞懂USB2.0设备为啥会‘重置’(Reset),附排查思路
别再乱插拔了!一文搞懂USB2.0设备为啥会‘重置’(Reset),附排查思路 USB设备突然断开、反复识别失败,这种问题在嵌入式开发和硬件调试中几乎人人都会遇到。上周我就被一个USB转串口模块折腾得够呛——每次传输到一半就…...
CodeMaker完整指南:5分钟掌握IntelliJ IDEA智能代码生成插件
CodeMaker完整指南:5分钟掌握IntelliJ IDEA智能代码生成插件 【免费下载链接】CodeMaker A idea-plugin for Java/Scala, support custom code template. 项目地址: https://gitcode.com/gh_mirrors/co/CodeMaker 还在为Java和Scala项目中的重复编码工作而烦…...
WinMerge过滤器进阶:从基础规则到实战场景配置
1. WinMerge过滤器入门:从零开始理解规则配置 WinMerge作为一款老牌开源文件对比工具,其过滤器功能常常被低估。很多开发者只是用它来排除版本控制目录,但实际上它能做的远不止这些。我第一次接触WinMerge过滤器是在处理一个Java项目时&#…...
OpalServe:构建团队AI工具统一控制平面,实现MCP服务器集中治理
1. 项目概述:为团队AI工具构建统一控制平面如果你和你的团队正在使用Claude Desktop、Cursor、Windsurf这类支持MCP(Model Context Protocol)的AI编程工具,那么下面这个场景你一定不陌生:每个开发者都需要在自己的机器…...
基于Apify与NLP的大麻监管情报系统架构与MCP集成实践
1. 项目概述:当AI遇见大麻监管情报如果你在合规、法律科技或者生命科学领域工作,最近可能听过“监管情报”这个词。简单说,它就是利用技术手段,从海量的、不断变化的法规文件中,自动提取、分析和监控关键信息ÿ…...
