在 C# 中如何检查参数是否为 null

前言

前不久,微软宣布从 C# 11 中移除参数空值检查功能,该功能允许在方法开始执行之前,在参数名称的末尾提供参数空值检查(!!操作符)。

3fb140cdc388163c6c3cbde0365af654.jpeg

那么,在 C# 中如何检查参数是否为 null 呢?

1. == null

这个可能是大家第一个就会想到的方法。

使用相等运算符符检查两个操作符是否相等:

if(user == null)throw new ArgumentNullException(nameof(user));

但是,==运算符可以被重载,可能导致检查空值的结果和预想的不一致:

public class User
{...public static bool operator ==(User user1, User user2){return false;}
}var user = null;
if(user == null) // falsethrow new ArgumentNullException(nameof(user));

这时,可以使用is运算符。

2. is null

is运算符检查表达式的结果是否与给定的类型相匹配。将表达式与 null 匹配时,编译器保证不会调用用户重载的==运算符:

public class User
{...public static bool operator ==(User user1, User user2){return false;}
}var user = null;
if(user is null) // truethrow new ArgumentNullException(nameof(user));

3. 模式匹配

“模式匹配”是一种测试表达式是否具有特定特征的方法。模式匹配最常见的方案之一是确保值不是 null:

int? maybe = 12;if (maybe is int number)
{Console.WriteLine($"The nullable int 'maybe' has the value {number}");
}
else
{Console.WriteLine("The nullable int 'maybe' doesn't hold a value");
}

但是,对于检查空值功能来说,这种方式可读性较差。

4. ArgumentNullException.ThrowIfNull

如果你使用的是 C# 10,建议你使用ArgumentNullException.ThrowIfNull方法检查空值:

ArgumentNullException.ThrowIfNull(user);

使用该方法的好处之一是在异常消息中会自动包含参数名称。

方法详细介绍可参看《.NET 6新特性试用 | ArgumentNullException卫语句》

结论

你是否还知道其他检查空值的方法,欢迎留言讨论。

添加微信号【MyIO666】,邀你加入技术交流群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带你剖析WebGis的世界奥秘----Geojson数据加载(高级)

前言:前两周我带你们分析了WebGis中关键步骤瓦片加载点击事件(具体的看前两篇文章),下面呢,我带大家来看看Geojson的加载及其点击事件 Geojson数据解析 GeoJSON是一种对各种地理数据结构进行编码的格式。GeoJSON对象可…

「Docker入门指北」容器很难理解?带你从头到尾捋一遍

文章目录 1. 初始虚拟化 🍑 虚拟化概念🍑 硬件虚拟化2. Docker容器 🍑 Docker技术的诞生🍑 容器与虚拟化🍑 性能差别🍑 Docker优势 编排有序高效易迁移快速部署3. 容器生态系统 🍑 核心技术 容器…

微服务:事务管理

几乎所有的信息管理系统都会涉及到事务,事务的目的是为了保证数据的一致性,这里说的一致性是数据库状态的一致性。说到数据库状态的一致性,相信大家都会想到 ACID :原子性(Atomic):在一个事件的…

Redis的那些事:一文入门Redis的基础操作

Redis是什么Redis,全称是Remote Dictionary Service,翻译过来就是,远程字典服务。redis属于nosql非关系型数据库。Nosql常见的数据关系,基本上是以key-value键值对形式存在的。Key-value: 就像翻阅中文字典或者单词字典,通过指定的…

10种提问型爆文标题句式 直接套用

如果你用1天的时间来写篇好文章,那你花掉半天时间想一个好标题都不过分! 你是不是觉得我有点言过其实了?没关系,先来问你2个问题: 1、花了很长时间,写了一篇很牛的卖货推文,定稿后&#xff0c…

2016 China Joy抢先看,文末有彩蛋!

这里只有你想不到的,没有你看不到的。 2016 China Joy开幕在即,天气成了最折磨各种媒体、展商和观众的小妖精,一会艳阳天,一会大暴雨,轩轩现在是这样的! 七月底的魔都,热的那叫一个销魂&#x…

JdbcTemplate+PageImpl实现多表分页查询

一、基础实体  MappedSuperclass public abstract class AbsIdEntity implements Serializable {private static final long serialVersionUID 7988377299341530426L;public final static int IS_DELETE_YES 1;// 标记删除public final static int IS_DELETE_NO 0;// 未删除…

消息队列选型手册

前言 消息队列中间件重要吗?面试必问问题之一,你说重不重要。我有时会问同事,为啥你用 RabbitMQ,不用 Kafka,或者 RocketMQ 呢? 他给我的回答:“因为公司用的就是这个,大家都这么用…

Jenkins 持续集成国产嵌入式操作系统 RT-Thread 的CI

我们直接在Jenkins的镜像基础上进行集成RT-Thread 的编译环境, 这样直接使用Shell 命令 最直接了当, 通过 第三方docker等插件, 尝试了计重方案, 没有找到理想中的感觉, 如果其他人有想法可以告知一二。 我们有现成的镜…

codevs原创抄袭题 5960 信使

题目描述 Description•战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系。信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位)。指挥部设在第一个哨所。当指挥部下达…

MongoDB精华总结

概述 MongoDB是属于文档型的NoSQL数据库,也就是文档数据库。文档数据库区别于传统的其它数据库,它是用来管理文档。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位&#xff0c…

认清性能问题

本文翻译自 Thinking Clearly About Performance 这是我三年前读到的一篇关于性能问题的好文,读完后还觉不过瘾,怕理解的不够遂又翻译了一遍,这也是当年我的第一次翻译。 这几年来每次碰到性能问题,我都会想起这篇文章&#xff0c…

简述:分布式CAP理论和BASE理论

目录 一、什么是CAP? Consistency (一致性): Availability (可用性): Partition Tolerance (分区容错性): 二、取舍策略 三、Base理论 1、基本可用 2、软状态 3、最终一致性 四、常见产品 Ereka Zookeeper 五、总结 一、什么是CAP&#xf…

WinForm(四)一种实现登录的方式

首先声明,这只是一种登录方式,并不是最好的方式,用这个例子为了说明登录窗体和Application的关系。在登录前,定义了用户实体,然后是一个通用的类,存放进程中当前登录的用户,所以CurrentUser是静…

Java多线程4:synchronized锁机制

脏读 一个常见的概念。在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的。 按照正常来看应该打印&quo…

.NET Community Toolkit 8.0.0 版本发布

.NET 社区工具包(.NET Community Toolkit )现已发布 8.0.0 版!.NET 社区工具包是一组适用于所有 .NET 开发人员,且与任何特定 UI 平台无关的帮助程序和 API。该工具包由 Microsoft 维护和发布,是 .NET 基金会的一部分&…

1、内存

程序为什么需要内存 程序运行的目的:程序运行是为了得到一定的结果,程序运行其实是在做一系列的数据计算,所以:程序代码数据;程序运行的目的不外乎2个:过程、结果; 用函数来类比:…

基于CAP组件实现补偿事务与幂等性保障

【.NET Core】| 总结/Edison Zhou1补偿事务和幂等性在微服务架构下,我们会采用异步通信来对各个微服务进行解耦,从而我们会用到消息中间件来传递各个消息。 补偿事务某些情况下,消费者需要返回值以告诉发布者执行结果,以便于发布者…

Docker与k8s

前言 随着k8s 作为容器编排解决方案变得越来越流行,有些人开始拿 Docker 和 k8s进行对比,不禁问道:Docker 不香吗? k8s 是kubernets的缩写,’8‘代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手&#xff…

Linux下启动tomcat报java.lang.OutOfMemoryError: PermGen space

2019独角兽企业重金招聘Python工程师标准>>> 一、错误信息 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav…