BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Sergio De Simone 关注 18 他的粉丝 ,译者 邱广 关注 0 他的粉丝 发布于 2015年9月9日. 估计阅读时间: 4 分钟 | ArchSummit北京2018 共同探讨机器学习、信息安全、微服务治理的关键点

微软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 typesHaskell Maybe,在Swift和Haskell中,选项类型可被视为对基本类型的一种封装(实际上,在Swift里选项类型就是泛型类型,在Haskell里就是monad)。

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

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT