BT

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

微软在C# 8中引入预览版可空引用类型

| 作者 Abel Avram 关注 4 他的粉丝 ,译者 薛命灯 关注 12 他的粉丝 发布于 2017年11月20日. 估计阅读时间: 3 分钟 | QCon北京2018全面起航:开启与Netflix、微软、ThoughtWorks等公司的技术创新之路!

亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的邮件和网页通知

微软已经为开发者提供了预览版的可空引用类型(Nullable Reference Type),想尝鲜的开发者可以尝试这个新特性,并提供反馈。

预览版可空引用类型是Visual Studio 2017 15.5 Preview 4+的Roslyn扩展,现在支持.NET框架,很快也将支持.NET Core。该特性在C# 8中是默认启用的。微软为此提供了安装指南

在C# 8中引入新的可空引用类型是为了解决十亿美元问题(Billion Dollar Mistake)。1965年,英国计算机科学家Tony Hoare在开发ALGOL时称其为空引用(Null Reference)。指针最主要的问题是,有时候它们会为空,而这并非我们所期望的。在将空指针作为一种特性引入之后,反而变成产生bug的主要源头。

早在2011年,用户就在Visual Studio User Voice里要求“在C#中引入不可空引用类型”,一年之后,经过投票,该需求排到了第15位,现在已经跑到了第一的位置上。这个特性之所以在很长一段时间内都无法实现,是因为C#的空引用到处可见。C#首席设计师Mads Torgersen解释说:

问题是空引用太有用了。在C#里,引用类型默认就是空值。还能用其他什么值来作为默认值吗?在你知道该给一个变量赋什么值之前,拿什么作为它的默认值?一个新创建的引用数组又该使用怎样的默认值?

有时候,空值本身也是有意义的。比如,有时候需要让一个字段不包含任何值,或者将空值作为参数进行传递也是没有问题的。但这些情况并不常见。这里还有另一个问题:像C#这样的语言并没有提供一种方式可以用于说明某处的空值是有意义的还是无意义的。

为了避免在C#中引入不可空引用类型,微软将引用类型规定为默认不可空,并提供了一些机制用于处理可空类型。他们认为,大部分情况下引用类型都是非空或被间接引用的。Torgersen写道:

  1. 我们相信,大部分情况下引用类型都不应该为空。可空引用类型是很罕见的(尽管很难说具体多罕见),所以需要单独对它们进行注解。
  2. C#已经提供了可空的值类型(value type)。
  3. 不应该让你自己或其他人在空值这个问题上有太多负担,除非你确定需要它们。空值应该是我们需要显式去指定的。

可空引用类型通过问号来定义,如下所示:

class Person {
  public string FirstName; // Not null
  public string? MiddleName; // May be null
  public string LastName; // Not null
}

微软希望开发者试用这个新特性,并提供反馈

更多的信息可参考 C# Futures: Nullable Reference TypesC# 8.0 PreviewedA Proposal for Non-Nullable Types in C#

查看英文原文Microsoft Previews Nullable Reference Types in C# 8

评价本文

专业度
风格

您好,朋友!

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

获得来自InfoQ的更多体验。

告诉我们您的想法

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

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

fcrf by 牛 腩

fcrf 3

允许的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通知我

1 讨论

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


找回密码....

Follow

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

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

Like

内容自由定制

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

Notifications

获取更新

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

BT