C# 9.0 新特性预览 - 空参数校验
C# 9.0 新特性预览 - 空参数校验
前言
随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它们。
目录
[C# 9.0 新特性预览 - 类型推导的 new]
[C# 9.0 新特性预览 - 空参数校验]
[C# 9.0 新特性预览 - Lambda 中的弃元]
[C# 9.0 新特性预览 - Record 类型]
[C# 9.0 新特性预览 - 模式匹配的改善]
[C# 9.0 新特性预览 - 其他小的变化]
简便的空参数校验 (Simplified Null Argument Checking)
目的
这个特性主要是为了更简便的检查方法的参数是否为 null 并抛出 ArgumentNullExceptiony 异常。
语法
语法很简单,在参数名后加个叹号即可:
void M(string name!) {
...
}
以上代码会被翻译为:
void M(string name) {
if (name is null) { throw new ArgumentNullException(nameof(name)); } ...
}
想必有些同学已经从上面代码看出来了,这个生成的空校验,只是校验参数是否为 null,这也就意味着它无法在值类型上使用,以下代码将报错:
// Error: 无法在值类型参数上使用!操作符
void G(T arg!) where T : struct {
}
当然,可空的值类型是可以的,但是编译器会提示一条警告,提示你在可空类型上进行了空检查:
// Warning: 将显式null检查与可为null的类型结合使用
void M(int? x!) {
}
类似的,在参数拥有默认值的情况下,也会提示警告
// Warning: 参数 'x' 进行了空检查但是它默认为空
void M(string x! = null) {
}
构造方法的场景
在构造方法的场景下,空参数校验将发生在任何其他代码的前面,包括:
对其他构造方法的链式调用,即 this() 或 base()
在构造方法内的隐式字段初始化
举个例子:
class C {
string field = GetString(); C(string name!): this(name) { ... }
}
以上代码会大致翻译为以下伪代码:
class C {
C(string name) if (name is null) { throw new ArgumentNullException(nameof(name)); } field = GetString(); :this(name); ...
}
Lambda 的场景
这个特性在 lambda 中也可以使用
void G() {
Func<string, string> s = x! => x;
}
不可以使用的场景
这个特性只能用于有方法体的方法中,也就意味着它不能用于抽象方法、接口、委托和部分方法。
以下代码编译器会报错:
interface C
{
public int M(string x!);// ERROR
}
不能用于属性。因为属性 setter 中的 value 是隐式的,不会出现在参数列表中,所以此特性不适用于属性。
string FirstName! { get; set; } // ERROR
不能用于 out / ref / in 的参数
public void M(out string x!) {} // ERROR
参考
[Proposal: Simplified Null Argument Checking]
[Unit test: NullCheckedParameterTests.cs]
[LDM-2019-07-10.md]
原文地址https://www.cnblogs.com/Rwing/p/csharp-9-0-preview-null-arg-checking.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
自学前端建立知识体系,是最简单入门以及工作后快速进阶的有效方法
「自学」是不可能太「系统」的,因为没有人帮你把每一个阶段的学习内容定义清晰。由于缺乏别人提供的反馈,你没办法知道自己某一阶段的学习是否完成了。从事前端多年,根据经验一般的建议方式是,你去实体书店看看相关的书籍,那本顺眼就从哪本学起,没必要太在乎信息来源是否系统化。不同的书针对有不同背景的人写,写作风格也不一样,既然没有人针对你因材施教,你必须自己凭感觉做出正确的选择,不要盲目使用别人的套,优秀的前端工程师无论在深度和广度上都得有自己的一套清晰透明的知识体系,同时更应该具备快速学习的能力。 比你优秀的人都在学习,你有什么理由不更加努力的去提升和造化自己呢? WEB前端工程师除了需要掌握基本的前端的开发技能外,当然,这里的基本技能说的比较宽泛,大致包括HTML、CSS、JavaScript、网站性能优化、SEO和服务器端基础知识等等,还得学会各种辅助工具进行开发辅助,提升工作上的开发效率。 看看技能图谱吧!淡定 看到这里是不是感觉有点害怕了,要学这么多啊,别怕,据统计,我们所学的知识其实真正在工作中的使用率20%左右,也就是说用20%的知识就可以胜任一份工作,那剩下的80%岂不是可以扔下了...
- 下一篇
为什么说云原生是企业数字化转型的通关密码?
即将开播:5月14日,Jenkins在K8S下的三种部署流程和实战演示 2020年,受疫情影响,谁家企业的日子都不好过。但是,如果把互联网企业和传统企业放在一起进行对比,就会发现,后者已被无形碾压。为什么传统企业或者是行业压力更大?受疫情的冲击更多?如果非要求根寻源,答案其实非常简单,归根结底是企业信息技术跟不上, IT基础设施及架构支撑能力不足,导致企业在数字化洪流中失去核心竞争力。所以,疫情过后,数字化转型会成为企业的必修课,而云原生应用则会成为企业解开数字化转型的通关密码。那么, 问题来了,什么是云原生应用? 变化中的云原生 最早,很多人认为云原生应用要满足几个重要特征,比如:面向微服务架构,具有自服务敏捷特性,能实现基于API的协作等等。 到了2015年,Google主导成立了云原生计算基金会(CNCF),认为云原生(Cloud Native)的定义应该包含三个方面,即应用容器化、面向微服务架构和应用支持容器的编排调度。 2018年,云原生生态的不断壮大,几乎所有主流云计算供应商都加入了CNCF基金会。这时,人们对云原生又进行了重新定义,那就是真正的云原生技术应该有利于各组织在...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- CentOS关闭SELinux安全模块
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker安装Oracle12C,快速搭建Oracle学习环境