C#的未来:简化参数空值验证

乍一看,提案#2145 似乎是 C# 8 可空引用类型特性的逻辑扩展。其基本思想是,开发人员不需要再显式地向接受非空参数的方法添加参数空值检查。然而,人们对于这个特性的争议很大。

本文试图说明这些选项以及它们的利弊,以便读者能够得出自己的看法。但在此之前,本文将简要说明为什么这在 C# 8 中仍然很重要。

目前,可空引用类型特性只是提供信息。它会警告开发人员在处理空值时的常见错误,但仅在编译时发出警告。当应用程序运行时,所有这些编译时检查都不存在。

此外,在使用反射或 dynamic 时,编译检查根本不起作用。

特定语法:感叹号操作符

原来的建议是使用感叹号操作符! 告诉编译器应添加参数空值检查。

复制代码

// 输入的代码
void Insert(string value!) 
{
...
}
// 编译后的代码
void Insert(string value) 
{
if (value == null)
throw new ArgumentNullException(nameof(value));
...
}

这个选项的理由是它破坏性小。它只需要对 C#编译器做一个小的修改,并且新语法完全向后兼容。
反对这一选项的理由是:

  • 它是一种适用面很窄的新语法;

  • 在阅读代码时很容易忽略它;

  • 很容易忘;

  • 声明参数不可为空是多余的。

另一个问题是,value! 可能意味着“请检查这个值是否为空”或“不需要检查,我知道它不是空的”,这取决于上下文。为了解决后一个问题,这个提案的一个变体是使用双感叹号操作符(string value!!)。

新属性

另一个选项是增加编译器可以识别的新属性,而不是新语法。

复制代码

void Insert([NotNull] string value)

就 C#而言,影响编译代码的属性并不是什么新东西,所以这可以与现有的模式保持一致。如果我们以前有声明性参数验证,它也会是这样的。
反对这一选项的理由是:

  • 与正在考虑的其他选项相比,它非常啰嗦;

  • 声明参数不可为空是多余的。

编译标识

下一个要考虑的选项是全局编译器标识。当该标识启用时,将检查所有非空参数。

这个选项的好处是你不需要考虑它。一旦启用,检查就会自动添加,这样就不会忘记,也不需要学习特殊的语法。

对此,第一个反对意见是,这可能存在性能方面的考虑。该选项的支持者认为,性能成本微不足道,该特性可以选择性地仅应用于公共方法,但可以对任何方法调用执行空值检查。

反对此特性的另一个理由是,开发人员可能希望抛出不同的异常。与此相反的观点是,除了 ArgumentNullException 之外,他们不应该抛出任何东西。此外,编译器指令可以在需要特殊处理时仅针对一个文件或方法禁用该特性。

最后一个观点最有说服力。这将是编译器标识第二次改变代码的语义。诸如“nullable”之类的编译器标识实际上并不会改变代码的行为方式,它只是一个编译时特性。

这个规则有个例外,就是’checked’编译器标识,它会改变整数溢出的行为。在 C#语言设计人员中,这被认为是一个错误,因为如果不知道编译器级如何设置标识,你就无法判断给定代码段的操作方式。

反对的观点并没有反驳这一点,但是,保持这项更改是使可空引用类型特性接近完成的必要步骤。对此,一些人坚持认为,NRT 从来就不是一个完备的解决方案,为了向后兼容,它不应该影响运行时行为。

外部 AOP 和 IL 织入

术语“IL 织入(IL weaving)”指的是在编译器完成后修改程序集的后处理步骤。这用于面向方面的编程工具,如 PostSharp 和已取消的 Code Contracts 项目。

争论中提到了具体的工具 Fody NullGuard 。 Fody 是遵循 MIT 许可协议的 IL 织入器,以 Mono.Cecil 为基础构建。

反对 IL 织入的理由是它需要第三方工具,不能很好地与 IDE 中运行的静态分析工具协同,会破坏 Edit-and-Continue,降低构建速度。

内部 AOP 或宏系统

有一些关于某种内部 AOP 或宏指令的讨论。这将允许开发人员扩展语言本身,而不是等待 C#的增强。

这次这个选项并没有得到太多的支持。内部 AOP 或宏系统会造成整个工具链的重大变化。此外,它可能会让开发人员创建自己的 C#方言,造成语言割裂。

什么也不做

最后一个选项是什么也不做。最有力的论据是,这仅仅是一个“生活质量”特性,并没有为开发者提供任何新的东西。虽然减少样板文件这点值得赞赏,但它们的负面影响超过了其所带来的好处。

而且,在任何给定的函数中,只需要少量代码来执行空检查。

反驳的观点是,这是 C#中最常见的样板代码示例之一,在示例和生产代码中经常缺失。对此,这一选项的支持者给出的回复是,静态分析工具将检测出大部分(尽管不是全部)空值检查的情况。启用 NRT 后,静态分析检查可以变得更加准确。

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

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

相关文章

android一键截图代码,偷偷告诉你ADB命令葵花宝典【一键截图和录屏】

先导预告作为一名测试工程师,每天可能都会面临从不同的设备导出截图或视频的工作,有些可能是bug截图或bug回放视频,有些截图可能是提供给PM或UI验收等等。 常规操作是iOS设备可以借助于iTools等工具导出;而安卓设备可能需要从设备…

【C# 调用 Go 语言】0x1 Hello Golang

C# 和 Golang 都不是世界上最好的语言。在不同的业务场景下,C# 和 Golang 各有所长。如果要编写一个网络程序,显然 Golang 更擅长,而如果要编写一个桌面 GUI 程序,那么 C# 简直不要太爽。我们完全可以将两者用在同一个项目中&…

云原生时代, 选择.NET Core

在容器、Kubernetes、DevOps,以及微服务等技术的推动下,2020年云原生势不可挡。 .NET Core 也非常契合 云原生对应用运行时的不同需求,.NET Core和kubernetes 同年诞生发展, 2018年kubernetes 已经奠定了在容器编排领域的王者地位…

WebApi管理和性能测试工具WebApiBenchmarks

说到WebApi管理和测试工具其实已经非常多的了,Postman、Swagger等在管理和维护上都非常出色;在性能测试方面也有不少的工具如:wrk,bombardier,http_load和ab等等。不过这些工具都具有单一性,管理和维护好的在性能测试上比较低效,对…

android中的shape资源,Android Drawable资源讲解之shape篇

运用好Android的drawable资源,在开发中就可以减少图片的使用量,这样既缩小了app的体积,也省去了设计图片的时间,而且也容易适配不同的屏幕尺寸。今天首先来讲讲shape资源的使用。1. Shape的属性介绍shape共支持四种形状&#xff0…

C# WPF 一个设计界面

微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏。C# WPF 一个设计界面今天正月初三,大家在家呆着挺好,不要忘了自我充电。武汉人民…

android中shape的属性,android中shape的属性

solid:实心,就是填充的意思android:color指定填充的颜色gradient:渐变android:startColor和android:endColor分别为起始和结束颜色,ndroid:angle是渐变角度,必须为45的整数倍。另外渐变默认的模式为android:type”line…

合集| 21 篇技术文章,带你从零入门 K8s

由阿里云与 CNCF 共同开发的《CNCF x Alibaba 云原生技术公开课》(视频课程)第一期已更新完毕。为了让大家有更好的学习体验,我们把视频课程转为图文,并请讲师重新编辑成文章,在公众号以“从零入门 K8s” 为系列进行每…

比尔盖茨早有预警:对大疫情爆发我们还没准备好

比尔盖茨早已预警,如今全球最大的危险不是核战争,而是高度传染的病毒,不是导弹,而是微生物。新型冠状病毒感染肺炎新增病例数仍在增长,钛媒体根据百度数据统计官方发布显示,截止发稿前1月30日9:30&#xff…

AcWing 3208. Z字形扫描

在图像编码的算法中,需要将一个给定的方形矩阵进行 Z 字形扫描(Zigzag Scan)。 给定一个 nn 的矩阵,Z 字形扫描的过程如下图所示: 对于下面的 44 的矩阵, 1 5 3 9 3 7 5 6 9 4 6 4 7 3 1 3 对其进行 Z 字形扫描后得到长度为 16 的…

写公众号的这一年多

2018年五月,在微信发布公众号助手之时我开通了个人公众号「不止dotNET」,到现在已经一年半多的时间了,非常时期,在家自我隔离,没事写写总结。数据总共发布了 53 篇原创文章,离之前的目标(每周一…

AcWing 703. 数独检查

**数独是一种流行的单人游戏。 目标是用数字填充9x9矩阵,使每列,每行和所有9个非重叠的3x3子矩阵包含从1到9的所有数字。 每个9x9矩阵在游戏开始时都会有部分数字已经给出,通常有一个独特的解决方案。 给定完成的N2∗N2数独矩阵&#xff0c…

pdf文件内容查看器 -- 采用wpf开发

前言 pdf是一种应用非常广的版式文档格式,已成为事实上的国际标准。关于pdf格式的文章汗牛充栋,本文也是关于pdf格式的文章,但是本文不是纸上谈兵;本人这几周一直研究pdf格式内容,不但对pfd格式的内容有所了解&#xf…

​WeihanLi.Npoi 根据模板导出Excel

WeihanLi.Npoi 根据模板导出ExcelIntro原来的导出方式比较适用于比较简单的导出,每一条数据在一行,数据列虽然自定义程度比较高,如果要一条数据对应多行就做不到了,于是就想支持根据模板导出,在 1.8.0 版本中引入了根据…

UC浏览器如何开启html5,如何开启手机uc浏览器中的极速模式

如何开启手机uc浏览器中的极速模式当我们在使用手机的时候,可以下载uc浏览器来浏览网页,为了提升网页的浏览速度,可以开启浏览器中的极速模式,接下来就由小编来告诉大家如何操作。具体如下:1.第一步,打开手…

前端扫盲:什么是API网关?为什么它有用?

API 通常被称为应用程序从后端服务访问数据和业务逻辑的前门。API 本质上是一个软件向其他人或程序提供的接口,允许他们与该软件进行交互。 在创建 API 时,需要选择编程语言(Java、Python、PHP 等)来编写 API 逻辑,还需要将 API 部署到服务器…

ProjectFileManager 发布!项目文件管理效率提升10倍以上!

值此特别的新春假期,盛派网络在这里先祝大家新春安康!鼠年平安、幸福、发财、万事如意!也祝福疫区的同胞和医护人员平安度过这一段关键时期!延长的假期显然也为我们日常工作带来了一些障碍,为了能够利用工具进一步提高…

简历中能熟练使用计算机怎么写,过了计算机二级,可以在简历里写“熟练掌握Excel”吗?...

原标题:过了计算机二级,可以在简历里写“熟练掌握Excel”吗?咨询/快消/互联网/四大/投行PEVC/券商绝大多数岗位都会要求“熟练掌握Excel”而尽管绝大多数同学“实际水平根本达不到工作要求”但是每一位同学都敢在简历上放一句薛定谔的「熟练掌…

.Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析

介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还需要掌握identity server4的基本用法,关于identity server4因为涉及到两个协议Oath2.0和openid conn…

【C# 调用 Go 语言】0x2 参数、返回值与类型转换

在上篇文章【C# 调用 Go 语言】0x1 Hello Golang 中,我们将 Golang 源码编译为动态链接库(dll),用 C# 调用 Golang 导出的方法并成功的看到了控制台的输出。本篇文章将对 C# 调用 Golang 方法做更详细的介绍,涉及如何…