NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

关于是否在 C#中加入不可空引用类型的争论

  • 2015-10-08
  • 本文字数:1579 字

    阅读完需:约 5 分钟

来自微软的 Mads Togersen 在近期所提出的一条提议,即在 C#语言中加入对不可空引用类型的支持在.NET 社区中引起了热烈的争论。人们对此提议的反应大相径庭,既有人对此表示赞赏,也不乏倾向于保持现状的意见。

在 Reddit 上,这条提议引起了大量关于向后兼容性方面的疑问。Strilanc 认为,如果应用了这一特性,按照这条提议的做法无法实现现有应用的平滑过渡

这条提议还有待改进,它对于保证二进制兼容性、源代码兼容性以及现有代码的渐进式过渡方面还存在着一些考虑不周的情况。

  1. 该提议造成了程序集级别上的意义转变,每个引用类型的名称意义都将变为不可空。它将一次性让整个项目级别的代码块的意义发生巨大的改变,要顺利地完成这一过程,需要付出大量的成本并承担极高的风险。这一点非常糟糕。
  2. 该提议在泛型方面还有待改善,它完全没有提及在大量的泛型代码中将不允许使用 default(T) 这一事实。这一点对于现有的代码将产生怎样的影响?可以采取哪些解决手段?那些确实需要这一功能的类型又将如何实现 default(T) 的效果?这些问题都还没有进行充分的探索。
  3. 这种方式岂不是会允许数组包含一些无效的初始值吗?这种做法公然地违反了类型系统的意义,既然如此,何必还要将它硬塞进去呢?

还有一方面的顾虑在于对于外部类库的向后兼容性,正如 Maplemario 所说:

那么问题来了。假设我要使用一个旧的类库,其中的函数都返回类型 T,无法它是否是可空的。现在,该提议产生了语言范式上的转变,它将 T 视为不可空的 T 类型,而我所调用的某个函数却有可能返回 null(在编写这个类库时,这种做法是合法的)。如果这种场景在整个程序中是一个偶尔才需要进行测试的用例,那么在理想的情况下,项目文档将指出这一点,而我在阅读文档后就知道应当在调用时进行空检查。或者因为我记得这是一段陈旧的代码,因此我将始终进行空检查。而在实际情况下,由于“T 即代表着不可空的 T”,因此我无需再进行空检查。如此一来,这段程序就会在我对空指针进行取值时崩溃。

人们也在热烈地讨论这一提议的替代方案。用户 00Davo 倾向于使用一种新的符号,以表示不可空类型

我也乐于让纯粹的 T 类型总是代表不可空的引用,而只有 T? 才能够接受空值,但这种改变对于向后兼容性来说就是一场恶梦。如果能引入一个全新的、明确的不可空引用符号,那么向后兼容性就会坚挺许多。比如使用 T! 符号,如何?

而在有些人看来,实现这一提议会造成的问题过多了。Number127 建议将静态分析作为一种替代方案

遗憾的是,目前来看,如果要以一种优雅的方法引入不可空引用类型,会造成过多的兼容性问题。我认为最有希望的替代方案是在维持目前的类型系统的情况下,通过静态分析技术以检查某个引用是否能够保证不为空。

在 GitHub 的页面上,人们同样在讨论静态分析这一方案。Paulo Morgado 对此进行了更进一步的阐述,他表示这条提议其实就代表了静态分析的使用

如果我的理解没错,这条提议其实就是一种增强版的方法契约而已。编译器在这里不会做出什么担保,更不用说运行时了。编译器所做的无非是对于那些声明为可空的变量进行数据流的分析而已。

在另一个话题中,Tomas Petricek 指出:这条提议必须考虑到其它 CLR 语言,例如 F#:

该提议能否详细地说明一下如何在 CLR 级别保存可空的标注信息?(我猜测这些标注应当并不具有运行时的意义,它们只会表现为某种.NET
attribute,或某种其它类型的元数据?)

我希望未来某个版本的 F#编译器能够辨识并理解这些标注信息,并定义某种“严格”模式,可空的类型在这种模式中将自动地暴露为 option<'T>
(或者差不多意思的某种类型)。

对于不可空引用类型的争论其实并不新鲜,在过去几年中,对这一问题已经进行了多次讨论。正如原微软的首席开发者 Eric Lippert 所说,在一个已具有15 年历史的语言中添加不可空引用是一项浩大的工程

查看英文原文 Debate: Adding Non-nullable References to C#

2015-10-08 19:001492
用户头像

发布了 428 篇内容, 共 172.1 次阅读, 收获喜欢 38 次。

关注

评论

发布
暂无评论
发现更多内容

长三角安防行业盛会“2024杭州国际安防产品展览会”

AIOTE智博会

安防展 杭州安防展 安防产品展

数据库系列:业内主流MySQL数据中间件梳理

不在线第一只蜗牛

MySQL 数据库 数据

测试开发 | 语言助手技术的发展历程

测吧(北京)科技有限公司

测试

测试开发 | 语音助手技术:Siri、Alexa、Google Assistant的背后

测吧(北京)科技有限公司

测试

诚邀报名|探索汽车智能化的开源未来

开放原子开源基金会

开源

分享一些很优秀的URL设计

伤感汤姆布利柏

大数据,领导者阵营!

腾讯云大数据

大数据

Lazada商品评论列表API:电商行业的实时反馈宝库

Noah

云技术分享 | 使用快照和 AMI 镜像进行 Amazon EC2 的备份和恢复

亚马逊云科技 (Amazon Web Services)

Amazon EC2 Amazon S3 amazon-ebs backup

测试开发 | AI在交通运输中的引领作用:智能交通系统与城市流动

测吧(北京)科技有限公司

测试

先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代

Authing

制造业 先进制造 国产化替代 身份自动化

字节跳动 Spark Shuffle 大规模云原生化演进实践

字节跳动云原生计算

大数据 spark 云原生

测试开发 | 人工智能引领交通运输革命

测吧(北京)科技有限公司

测试

全方位的账号安全管理

尚思卓越

黑客 网络安全

软件测试/测试开发丨Python元组

测试人

Python 软件测试

Sync Folders Pro for Mac(文件夹数据同步工具) v4.6.9永久激活版

mac

苹果mac Windows软件 Sync Folders Pro 文件夹同步工具

测试开发 | 智能系统在能源管理中的优化

测吧(北京)科技有限公司

测试

【第七在线】供应链协作与商品计划:建立强大的合作关系

第七在线

铸就安全可信的数字化「信息枢纽」—华为云ROMA Connect荣膺软件产品可信【卓越级】认证

华为云PaaS服务小智

云计算 华为云

【第七在线】季节性商品计划:如何应对时尚行业的快速变化

第七在线

逻辑多租场景下,故障爆炸半径的控制实践

华为云开发者联盟

开发 华为云 华为云开发者联盟

科普:多领域分布式协同仿真

DevOps和数字孪生

协同仿真

「大模型摇摇乐」狂欢落幕!盘点那些让你意想不到的应用集锦

飞桨PaddlePaddle

开发者 大模型 AI应用 文心一言

测试开发 | 智能系统在航空航天领域的应用与创新

测吧(北京)科技有限公司

测试

AGI时代的奠基石:Agent+算力+大模型是构建AI未来的三驾马车吗?

蓝海大脑GPU

openEuler汇聚开源力量,共建全球开源生态

彭飞

Cloudeye对接Prometheus实现华为云全方位监控

华为云开发者联盟

云计算 华为云 华为云开发者联盟 华为云弹性云服务器

2023开放原子开发者大会全日程

开放原子开源基金会

开源

倒计时2天|2023开放原子开发者大会15个技术平行专场议程速览

开放原子开源基金会

开源

身为程序员,这几款工具老少皆宜

高端章鱼哥

持续集成 单元测试 开发工具

低代码:万事俱备,就差一个程序员

互联网工科生

软件开发 低代码 JNPF

关于是否在C#中加入不可空引用类型的争论_.NET_Pierre-Luc Maheu_InfoQ精选文章