建设工商联网站的意义,高端品牌网站建设需要注意什么,学电脑在哪里报名,点了网站域名会跳转C# 11 中的参数 null 检查IntroC# 11 将引入一个新的操作符 !! 来简化我们代码中的对于参数的 null 检查#xff0c;昨天发布的 .NET 7 Preview 1 已经支持了这一语法#xff0c;感兴趣的不妨来试一下吧#xff0c;下面我们就来看一下如何使用吧Prepare如果你想在本地代码中… C# 11 中的参数 null 检查IntroC# 11 将引入一个新的操作符 !! 来简化我们代码中的对于参数的 null 检查昨天发布的 .NET 7 Preview 1 已经支持了这一语法感兴趣的不妨来试一下吧下面我们就来看一下如何使用吧Prepare如果你想在本地代码中进行编译测试需要安装 .NET 7 Preview 1 的 SDK下载地址然后在本地创建一个控制台应用程序可以通过命令 dotnet new console 来创建创建成功之后手动修改项目文件配置 C# 语言版本为 preview如下所示添加 LangVersionpreview/LangVersionProject SdkMicrosoft.NET.SdkPropertyGroupOutputTypeExe/OutputTypeTargetFrameworknet7.0/TargetFramework ImplicitUsingsenable/ImplicitUsingsNullableenable/NullableLangVersionpreview/LangVersion/PropertyGroup/ProjectSample!! 是一个新的操作符加在参数后面编译器会自动生成一段 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 来执行代码可以看到类似下面的输出结果output可以看到当传了一个 null 的时候会抛出一个 ArgumentNullException 的异常说明确实是做了 null 检查的这个操作符不仅仅适用于方法参数也可以用于委托参数、索引器等Whats inside从上面的输出结果我们可以看到有做 null 检查实际是什么样子的呢我们可以反编译一下代码来看一下实际生成的代码是怎么样的反编译的结果如下Program 类型和 Main 方法 是由编译器自动生成的这是 C# 9 引入的顶级语句 (Top-Level Statements)可以看到我们代码中的 Hello 方法没有了有一个编译器生成的另外一个方法它是我们原来方法的变形只增加了一句代码PrivateImplementationDetails.ThrowIfNull(name, name);我们再看一下其中的实现实现如下PrivateImplementationDetails可以看到在这里实现了 null 检查如果参数是 null 就会抛出 ArgumentNullException 异常看到这里相信大家都知道是怎么实现的了那么有个问题可以思考一下这里我们使用了一个方法如果有两个这样的方法会是什么样的呢PrivateImplementationDetails 这个类会生成两个吗我们来尝试一下我们把这个方法拷贝一下改个名字再来反编译一下void Hello1(string name!!) Console.WriteLine($Hello, {name}!);反编译结果如下可以看到实际是调用的同一个方法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/ 来体验编译器的新特性.NET runtime 中的代码已经用上了这个新的操作符来简化参数的 null 检查可以参考https://github.com/dotnet/runtime/pull/64720Referenceshttps://github.com/dotnet/csharplang/blob/c7361547c0c00e0116f6e4ac3767d7b6bc7442b6/proposals/param-nullchecking.mdhttps://github.com/dotnet/runtime/pull/64720https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp11Sample