InfoQ Geekathon 大模型技术应用创新大赛 了解详情
写点什么

微软提议在 C# 7 中为引用增加选项类型

  • 2015-09-08
  • 本文字数:1245 字

    阅读完需:约 4 分钟

微软 C#语言的项目经理 Mads Torgersen,最近提议在C# 7 中引入可为选项类型(option types)的引用类型。加入选项类型能让C#语言变得更安全,正如Torgersen 所说,在C#里,因为任一引用类型都能引用一个空值,从而导致了空引用异常的泛滥成灾,而使用选项类型能减少空引用异常的产生。

C#已经对 nullable 值类型提供了支持,即对基于 struct 的已提供了支持,但不支持基于 class 的引用类型。对一门现存的已然成熟的编程语言事后加入选项类型,这其中存在着巨大的复杂性,出于这一原因,Torgersen 不打算建立一套“滴水不漏的”机制,而是在检测到代码可能存在解引用空值的时候发出警告信息。

新的提议方案对一个现有的引用类型 T 有如下约定:

  • T 用来表示一个非 nullable 类型;
  • T? 用来表示一个 nullable 引用类型;
  • 在以下情况下,编译器将发出告警信息:
    • 一个 nullable 的T? 类型被解引用或者转化为一个非nullable 类型;
    • 将 null/default(T) 赋值给非 nullable T 类型变量;
    • 流分析检测到一个 nullable 引用很可能不再是空值;
    • 构造函数在返回前未对非 nullable 引用进行赋值;
    • 构造函数使用尚未赋值的非 nullable 引用。

另一方面,当一个非 nullable 数组在进行初始化时,无法确保其中为 null 的数组成员不被保留下来。

使用空条件操作符 null-conditional operator )?.,可参考介绍 C# 6 ,将产生以下效果:

复制代码
string s;
string? ns = SomeStringMaybe();
s = ns; // emits warning
if (ns != null) { s = ns; } // ok
WriteLine(ns.Length); // emits warning
WriteLine(ns?.Length); // ok

尽管使用这种新设计出的方法不用改动任何的现有代码,但该方法仍可能对编译器的行为产生潜在的影响,因为在当前的 C#里,T 实际上用来表示一个 nullable 类型。因此,Torgersen 说,需要另外再新增一套机制来关闭告警信息,用于确保在跨 C#版本和程序集下的编译兼容性。

需要重点声明的是,当所赋的值为 null 时,若编译器只产生告警信息,那么 C# 7 仍将会允许一个非 nullable 类型 T 包含 null 类型,这主要是出于对程序集兼容性的考虑。这也使得C# 7 表现得与其他编程语言大相径庭,比如 Swift option types Haskell Maybe ,在 Swift 和 Haskell 中,选项类型可被视为对基本类型的一种封装(实际上,在 Swift 里选项类型就是泛型类型,在 Haskell 里就是 monad)。

从通告的评论来看,人们对微软的提议反应不一。有些人担心在重新定义了类型 T 为非 nullable 之后,现存的 C#代码会产生大量的对他们来说毫无意义的告警信息。还有些人认为应该用 T! 或者其他不同于基本类型 T 的表示方式来表征非 nullable 类型,基本类型 T 继续用来表示 nullable 类型。微软的提议方法没有让任何已有的代码受益,应对其进行重构以使其有助于代码的 non-nullability。另外有部分人支持该提议,并表示自己更喜欢这种“严谨的”模式,在这种模式下,空值经由 option或其它等效结构被有效地封装了起来。

查看英文原文 A Proposal to Add Option Types for References to C# 7

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2015-09-08 19:002305
用户头像

发布了 30 篇内容, 共 79027 次阅读, 收获喜欢 1 次。

关注

评论

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

特别呈现|腾讯云 X K+ 峰会共同打造软件工程新生态

CODING DevOps

MySQL:无锁可扩展的 WAL 设计

互联网工科生

MySQL

程序员们集体诟病,低代码真的如此不堪?

伤感汤姆布利柏

在找稳定的企业级数据云平台?奇点云DataSimba R4.9 LTS发布

奇点云

产品升级 奇点云 数据基础设施 DataSimba

无法安装此app,因为无法验证其完整性 ,解决方案

雪奈椰子

处理开发者账号到期导致APP下架的方处理开发者账号到期导致APP下架的方法

雪奈椰子

探索智慧未来:JNPF低代码开发平台引领产业智能化革命!

加入高科技仿生人

低代码 智慧工厂 现代产业

【6.23-6.30】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

什么是MES?国内做MES系统的企业哪家好?

优秀

MES系统 mes

对标世界一流!构建更适合国有企业的全面预算体系!

用友BIP

全面预算

用友:时序数据库要更懂业务场景

用友BIP

IM即时通讯APP在聊天场景中的应用

WorkPlus

数字化催生新文化,JNPF加速开发平台带来共赢未来!

EquatorCoco

低代码 数字化 新文化

低代码助力内部系统开发

高端章鱼哥

低代码 系统开发 JNPF

NFTScan 推出「NFTScan Connect」计划,支持早期 Web3 初创团队

NFT Research

#Web3

企业号 7 月 PK 榜,火热开启!

InfoQ写作社区官方

热门活动 企业号 7 月 PK 榜

强化学习从基础到进阶–案例与实践[11]:AlphaStar论文解读、监督学习、强化学习、模仿学习、多智能体学习、消融实验

汀丶人工智能

人工智能 深度学习 强化学习 7月日更

SQL 优化(三):使用覆盖索引

hungxy

神级程序员,都在用哪些生产力工具?

互联网工科生

程序员 工具 生产力

升级企业数智化底座,助力企业实现数智连接

用友BIP

数智底座

golang 实现四层负载均衡

蓝胖子的编程梦

nginx 负载均衡 LVS MySQL 高可用 #go

解放开发者——5个好用的低代码开发平台

树上有只程序猿

🔥🔥🔥我可算把【年中复盘】玩明白了

禅道项目管理

总结 复盘

Java 网络编程 —— 客户端协议处理框架

快乐非自愿限量之名

Java url

强化学习从基础到进阶-案例与实践[4.2]:深度Q网络DQN-Cart pole游戏展示

汀丶人工智能

人工智能 深度学习 强化学习 DQN

强化学习从基础到进阶-案例与实践[5.1]:Policy Gradient策略梯度-Cart pole游戏展示

汀丶人工智能

人工智能 深度学习 强化学习 策略梯度

制造企业实施MES系统受到的影响因素有哪些?

优秀

MES系统

窃取个人数据?OpenAI遭集体诉讼!"拯救数智化时代!低代码开发平台:打造信息安全的无敌守护者

不在线第一只蜗牛

低代码 信息安全 ChatGPT 数智时代

Rainbond助力“信创应用”迁移上云

北京好雨科技有限公司

云原生 rainbond 信创云 企业号 7 月 PK 榜

低代码平台源代码对程序有哪些作用?

这我可不懂

低代码 源代码 JNPF

2023-06-30:给你一个 rows * cols 大小的矩形披萨和一个整数 k, 矩形包含两种字符: ‘A‘ (表示苹果)和 ‘.‘ (表示空白格子), 你需要切披萨 k-1 次,得到 k 块披

福大大架构师每日一题

Go 算法 rust Go 语言 福大大架构师每日一题

  • 扫码添加小助手
    领取最新资料包
微软提议在C# 7中为引用增加选项类型_.NET_Sergio De Simone_InfoQ精选文章