C# 11 中的参数 null 检查

C# 11 中的参数 null 检查

Intro

C# 11 将引入一个新的操作符 !! 来简化我们代码中的对于参数的 null 检查,昨天发布的 .NET 7 Preview 1 已经支持了这一语法,感兴趣的不妨来试一下吧,下面我们就来看一下如何使用吧

Prepare

如果你想在本地代码中进行编译测试,需要安装 .NET 7 Preview 1 的 SDK,下载地址:

然后在本地创建一个控制台应用程序,可以通过命令 dotnet new console 来创建

创建成功之后,手动修改项目文件,配置 C# 语言版本为 preview,如下所示添加 <LangVersion>preview</LangVersion>

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net7.0</TargetFramework>    <ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable>
+   <LangVersion>preview</LangVersion></PropertyGroup></Project>

Sample

!! 是一个新的操作符,加在参数后面编译器会自动生成一段 null 检查的代码

bang-bang operator

下面我们就来试一下吧,测试代码如下:

Hello("World");try
{Hello(null!);
}
catch (Exception ex)
{Console.WriteLine(ex);
}void Hello(string name!!)
{Console.WriteLine($"Hello, {name}!");
}

运行 dotnet run 来执行代码,可以看到类似下面的输出结果:

f520782e329f5b15d37ace6566696b54.png

output

可以看到当传了一个 null 的时候,会抛出一个 ArgumentNullException 的异常,说明确实是做了 null 检查的

这个操作符不仅仅适用于方法参数,也可以用于委托参数、索引器等

What's inside

从上面的输出结果我们可以看到有做 null 检查,实际是什么样子的呢?我们可以反编译一下代码来看一下实际生成的代码是怎么样的

反编译的结果如下:

cc58a27e69679a30b4c466dbb87ad120.png

Program 类型和 Main 方法 是由编译器自动生成的,这是 C# 9 引入的顶级语句 (Top-Level Statements)

可以看到我们代码中的 Hello 方法没有了,有一个编译器生成的另外一个方法,它是我们原来方法的变形,只增加了一句代码

<PrivateImplementationDetails>.ThrowIfNull(name, "name");

我们再看一下其中的实现,实现如下:

432d20e6928c129f2984b87169fa95b3.png

PrivateImplementationDetails

可以看到在这里实现了 null 检查,如果参数是 null 就会抛出 ArgumentNullException 异常

看到这里相信大家都知道是怎么实现的了,那么有个问题可以思考一下,这里我们使用了一个方法,如果有两个这样的方法会是什么样的呢?<PrivateImplementationDetails> 这个类会生成两个吗?我们来尝试一下,我们把这个方法拷贝一下改个名字再来反编译一下

void Hello1(string name!!) => Console.WriteLine($"Hello, {name}!");

反编译结果如下:

ace709706e8ac1336874a36a5f2aedd1.png

可以看到实际是调用的同一个方法,<PrivateImplementationDetails> 这个类型只生成了一次

那如果这两个方法是在两个项目中会怎么样呢?可以自己动手试一下~~

More

这个操作符使用时,还有一些注意事项

如果你启用了可空引用类型,并将参数声明为可空的引用类型,编译器会产生一个警告,因为实际上是不应该为 null 的,为 null 就会抛异常,所以编译器会警告,示例如下:

// warning CS8995: Nullable type 'string?' is null-checked and will throw if null.
// void Hello2(string? name!!) => Console.WriteLine($"Hello, {name}!");

值类型是不能使用这个操作符的,因为值类型是不会为 null 的,编译器会直接报错,但可空值类型是可以的,例如:

// error CS8992: Parameter 'int' is a non-nullable value type and cannot be null-checked.
// void Hello3(int name!!) => Console.WriteLine($"Hello, {name}!");

另外 out 参数也不能使用这个操作符,如:

// error CS8994: 'out' parameter 'name' cannot be null-checked.
// void Hello4(out string name!!) => name = "World";

想要尝试的小伙伴可以装一下 .NET 7 preview 1 来体验,如果不想装 preview 也可以通过 一个在线网站 sharplab https://sharplab.io/ 来体验编译器的新特性

c8415bd9b997e374373dee1e44d84ad7.png

.NET runtime 中的代码已经用上了这个新的操作符来简化参数的 null 检查,可以参考:https://github.com/dotnet/runtime/pull/64720

References

  • https://github.com/dotnet/csharplang/blob/c7361547c0c00e0116f6e4ac3767d7b6bc7442b6/proposals/param-nullchecking.md

  • https://github.com/dotnet/runtime/pull/64720

  • https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp11Sample

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

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

相关文章

cms的 php代码,KingCMS/PHP可执行代码

实例:Example :{king:title/}{king:content/}作者:{king:_author/}上面的代码没有什么特别的地方&#xff0c;但客户的要求有了变化&#xff0c;他想在详细页的内容开始前调用缩略图&#xff0c;没有则忽略。所以问题也来了&#xff0c;因为有的文章有缩略图&#xff0c;有的没…

CentOS单机安装k8s并部署.NET 6程序

学习云原生&#xff0c;k8s 是一个基础&#xff0c;为了做一些实验&#xff0c;单机部署是最方便的&#xff0c;下面将介绍在 CentOS 中单机安装 k8s &#xff0c;并将一个 .NET 6 的程序发布到 k8s 中。环境宿主机&#xff1a;Mac 10.15.7CentOS版本&#xff1a;7.6内存&#…

php session缓存,扫盲:php session缓存至memcached中的方法

memcached是一套分布式的快取系统&#xff0c;当初是DangaInteractive为了LiveJournal所发展的&#xff0c;但被许多软件(如MediaWiki)所使用。这是一套开放源代码软件&#xff0c;以BSDlicens更改为&#xff1a;session.save_handler memcachesession.save_path"tcp://12…

MASA Framework - DDD设计(2)

Clean Architecture国内对于Clean Architecture的翻译很多&#xff0c;干净/整洁/清晰。但无论哪一种都说明了它简洁、清晰的特性。早期它长这样看到这张图的同学可能会对另外一张图有印象洋葱架构(Onion)现在长这样看起来好像是亲戚&#xff0c;它们的确也有着千丝万缕的关系分…

SpringMVC核心分发器DispatcherServlet分析[附带源码分析]

目录 前言DispatcherServlet初始化过程DispatcherServlet处理请求过程总结参考资料前言 SpringMVC是目前主流的Web MVC框架之一。 如果有同学对它不熟悉&#xff0c;那么请参考它的入门blog&#xff1a;http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 本…

WPF 展示视频修改为WriteableBitmap

WPF开发者QQ群&#xff1a;340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇&#xff0c;进行WriteableBitmap性能优化修改后运行对比如下&#xff1a;前&#xff08;C…

linux之类似Windows的资源管理器gnome-system-monitor(可用这个杀死进程)

1、使用 直接运行下面命令gnome-system-monitor 如果没有安装用下面命令安装sudo apt-get install gnome-system-monitor 2、结果 可以点击右键然后杀死相关进程&#xff0c;这也是杀死进程的办法。

HttpClient异常处理手册

HttpClient异常处理手册 开源中国 发表于 2014-08-26 19:44:06异常处理 HttpClient的使用者在执行HTPP方法&#xff08;GET,PUT,DELETE等&#xff09;&#xff0c;可能遇到会两种主要类型的异常&#xff1a; 传输异常协议异常并不是所有的异常都会传播给HttpClient的用户。Htt…

再读《精通css》02:选择器

2019独角兽企业重金招聘Python工程师标准>>> 1.2 为样式找到目标1、类型选择器用来选择特定类型的原素。比如p&#xff0c;a&#xff0c;h1等等。也叫元素选择器或简单选择器。2、后代选择器用来寻找特定元素或元素组的后代。后代选择器由两个选择器之间的空格表示。…

余弦欧式距离matlab,余弦相似度和欧几里得距离

1.余弦相似度同过两个向量的夹角的余弦值来判断两个向量的相似度。余弦值取值[-1,1],越接近1&#xff0c;两向量夹角越小&#xff0c;越相似。图片.png二维公式&#xff1a;图片.pngn维公式&#xff1a;图片.png存在的问题[1]&#xff1a;余弦相似度更多的是从方向上区分差异&a…

App Store 排名获取。

为什么80%的码农都做不了架构师&#xff1f;>>> https://affiliate.itunes.apple.com/resources/documentation/genre-mapping/ app榜示例 &#xff0c; 取中国免费榜前10条&#xff1a; 首先访问 https://itunes.apple.com/WebObjects/MZStoreServices.woa…

使用 Playwright 对 ASP.NET Core 应用执行功能测试

前言在前面的文章中&#xff0c;我们已经介绍过 Playwright for .NET&#xff0c;它常用于自动化测试已经部署好的 Web 应用。其实&#xff0c;开发人员也可以使用它在 ASP.NET Core 应用程序中进行功能测试。功能测试功能测试是从用户角度编写&#xff0c;用于基于其要求验证系…

PHP自动查找指定文件夹下所有文件BOM和删除所有文件

2019独角兽企业重金招聘Python工程师标准>>> <?php if (isset($_GET[dir])){ //设置文件目录 $basedir$_GET[dir]; }else{ $basedir .; } $auto 1; checkdir($basedir); function checkdir($basedir){ if ($dh opendir(…

php支持cs吗,关于composer、phpmd和phpcs于windows中的安装与使用方法

Composer项目地址 https://getcomposer.org中文 http://docs.phpcomposer.com/Composer是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库&#xff0c;它会在你的项目中为你安装他们。一、安装Composer官网有详细介绍安装方法&#xff0c;包括windows和linux系统。以…

基于ASP.NET Core api 的服务器事件发送

现如今程序员对Web API的调用已经是轻车熟路。但是传统的api调用都是拉模式&#xff0c;也就是主动发起请求去调用一个api.但是程序员往往对另一种很有用的模式很陌生&#xff0c;即推模式。拉模式 - 主动调用并获取结果的模式。推模式 - 订阅并接受数据推送的模式。今天要介绍…

Android之解决java.lang.NoSuchMethodError:android.os.powerManager.isInteractive问题

1、问题 再三星平板(Android 4.2.2系统)我们代码powerManager调用了函数isInteractive方法,出现下面错误 java.lang.NoSuchMethodError:android.os.powerManager.isInteractive 2、解决办法 1、一开始想用try catch来解决,肯定不行,功能没实现,而且进程还是会挂 2…

DDD为何叫好不叫座?兼论DCI与业务分析的方法论

今天&#xff0c;仔细阅读了园子里面的一个朋友写的《一缕阳光&#xff1a;DDD&#xff08;领域驱动设计&#xff09;应对具体业务场景&#xff0c;如何聚焦 Domain Model&#xff08;领域模型&#xff09;&#xff1f;》(http://www.cnblogs.com/xishuai/p/3800656.html)这篇博…

php 实现的字典序排列算法,字典序的一个生成算法

字典序的一个生成算法。最近在LeetCode刷题&#xff0c;刷到一个题&#xff0c;链接&#xff1a;https://leetcode-cn.com/problems/permutation-sequence/这个题要求得长度为n的字典序列的第k个排列。我们知道&#xff0c;字典序列是一个长度为n(n>1)&#xff0c;元素为1~n…

BeetleX服务网关流量控制

为了保障后台服务应用更可靠地运行&#xff0c;网关提供了一些基础流量控制功能&#xff1b;通过这一功能可以限制流转到后台应用服务的处理量&#xff0c;从而让服务在可应对的并发范围内更可靠地运作。服务网关提供了流量控制有基础控制、IP、域名和请求路径。基础配置主要包…

【cocos2d-x】2.0升级为3.0一些常见变化纪录

1.去CC之前2.0的CC**,把CC都去掉&#xff0c;基本的元素都是保留的2.0CCSprite CCCallFunc CCNode ..3.0Sprite CallFunc Node ..2.cc***结构体改变2.0 ccp(x,y) ccpAdd(p1,p2)ccpSubccpMultccpLength(p)ccpDot(p1,p2);ccc3()ccc4()ccWHITECCPointZeroCCSizeZer…