写点什么

关于是否在 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:002109
用户头像

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

关注

评论

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

博睿数据领跑中国APMO市场,Bonree ONE 2025秋季版即将全球发布!

博睿数据

全球首个超声多模态大模型!百度百舸支撑海豚智能实现高效训练与稳定服务

Baidu AICLOUD

大模型

AI赋能:下一代海外社媒推广的智能化路径

Wolink

跨境电商 出海服务商 出海企业 海外营销推广 达人营销

AI大学生职业生涯规划平台:技术驱动职业发展,开启智能未来

上海拔俗

深夜的调试界面,藏着微信生态的黄金密码

微擎应用市场

企业如何进行海外营销?

Wolink

跨境贸易 跨境电商 出海服务商 出海企业 海外营销推广

微网红矩阵,正在颠覆传统海外营销的精准投放模式

Wolink

跨境电商 出海服务商 海外营销推广 沃链Wolink 达人营销

告别浪费:如何打造高转化率的海外社交媒体广告策略?

Wolink

跨境电商 出海服务商 海外社媒运营 海外营销推广 品牌出海

HarmonyOS 6发布:系统级智能体小艺进阶超级助理,衣食住行一句话轻松搞定

新消费日报

低代码视图真分页实操:API/SQL 接口配置 + 查询字段避坑,数据加载不卡顿

引迈信息

海外红人营销如何帮助品牌建立影响力?

Wolink

出海服务商 出海企业 海外社媒运营 海外营销推广 沃链Wolink

云栖实录 | 驶入智驾深水区:广汽的“数据突围“之路

阿里云大数据AI技术

阿里云 MaxCompute Dataworks PAI 大数据AI平台

ONES MCP Server 上线,支持主流 AI Coding 工具集成

万事ONES

研发管理 ONES cursor mcpserver aicoding

Nacos 3.1.0 正式发布,支持 A2A 注册中心与 MCP 注册协议增强

阿里巴巴云原生

阿里云 云原生 nacos

买对存储,省时省心 | 双十一闪迪帮你轻松玩转数据世界

极客天地

轻量服务器Lighthouse + 1Panel + Halo,三步打造你的专属网站

GoodTime

服务器 建站 halo LightHouse 1Panel

Last call丨三菱汽车、Rolls Royce航空发动机、Mendix 邀您共探数字孪生技术如何落地,促进企业商业价值提升

Altair RapidMiner

AI 汽车 数字孪生 仿真 CAE

Higress v2.1.8:30 项引擎更新 + 4 项控制台更新

阿里巴巴云原生

阿里云 云原生 Higress

自建团队还是寻找代理?海外推广模式的优劣对比与选型建议

Wolink

跨境电商 出海 出海服务商 海外营销推广 达人营销

IT项目管理的智能化新模式-ManageEngine卓豪

ServiceDesk_Plus

ManageEngine卓豪

从数据不通到流程自动化:财务 RPA 如何打通 ERP 与银行的 “最后一公里”?

Techinsight

基于云技术的域名解析系统研究:传统解析技术的局限性

防火墙后吃泡面

怎样获取快递信心推送服务的API接口?

快递鸟

不止于曝光:公司如何利用海外KOL营销打造长效品牌资产

Wolink

跨境电商 出海企业 海外社媒运营 海外营销推广 达人营销

就餐宝微信小程序:重塑企业食堂管理新生态

微擎应用市场

高效便捷的微信小程序信息管理工具,助力教育场景精细化运营

微擎应用市场

海外达人营销全景图:从策略制定到效果衡量的完整框架

Wolink

跨境贸易 跨境电商 出海服务商 海外营销推广 达人营销

数字孪生落地难?点量云流五招破局

点量实时云渲染

3D渲染 数字孪生 智慧工厂 云渲染 元宇宙

企业海外营销预算如何分配?高效ROI模型搭建

Wolink

跨境电商 出海服务商 出海企业 海外社媒营销 海外营销推广

企业如何选择最合适的海外推广渠道

Wolink

跨境贸易 跨境电商 出海企业 海外营销推广 达人营销

全球首个超声多模态大模型!百度百舸支撑海豚智能实现高效训练与稳定服务

新消费日报

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