9月7日-8日,相约 2023 腾讯全球数字生态大会!聚焦产业未来发展新趋势! 了解详情
写点什么

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

  • 2017-11-19
  • 本文字数:1037 字

    阅读完需:约 3 分钟

微软已经为开发者提供了预览版的可空引用类型(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 Types C# 8.0 Previewed A Proposal for Non-Nullable Types in C#

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

活动推荐:

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

2017-11-19 18:001783
用户头像

发布了 321 篇内容, 共 129.1 次阅读, 收获喜欢 139 次。

关注

评论

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

深入RecyclerView学习—缓存机制,kotlin带参数的单例模式

android 程序员 移动开发

深入浅出:MVVM+ViewBinding,互联网寒冬公司倒闭后

android 程序员 移动开发

深入理解Flutter动画原理,安卓framework

android 程序员 移动开发

某一线互联网大厂内部超高质量Flutter+Kotlin笔记!技术与实战篇

android 程序员 移动开发

深入Flutter TextField,android开发流程图

android 程序员 移动开发

深入探索编译插桩技术(三、解密 JVM 字节码,都是精髓

android 程序员 移动开发

滴滴DoKit Android核心原理揭秘之函数耗时,android组件化

android 程序员 移动开发

没有对象怎么面向对象编程呢?真让人头秃!,sharedpreferences跨进程

android 程序员 移动开发

深入探索 Android 内存优化(炼狱级别-上),安卓消息分发机制

android 程序员 移动开发

深入探索 Android 网络优化(二、网络优化基础篇,移动开发框架

android 程序员 移动开发

温故知新:深入理解Android插件化技术,Android高级插件化强化实战

android 程序员 移动开发

毕业3年,我是如何从年薪10W的拖拽工程师成为30W资深Android开发者!(1)

android 程序员 移动开发

浅谈Android网络通信的前世今生--网络基础,深度剖析原理

android 程序员 移动开发

炸裂!万字长文拿下HTTP 我在鹅厂等你!(1),html5移动开发框架

android 程序员 移动开发

注意!关于怎么理解 onStart可见但不可交互,程序员千万不要小瞧了这个问题

android 程序员 移动开发

深入学习-Gradle-自动化构建技术(五)Gradle-插件架构实现原理剖析-

android 程序员 移动开发

浅谈ConcurrentHashMap,android游戏开发大全第二版代码

android 程序员 移动开发

深入Android系统 Binder-2-使用,阿里P7亲自讲解

android 程序员 移动开发

深入探索 Android 内存优化(炼狱级别-上)(1),2021年最新Android面试点梳理

android 程序员 移动开发

深入理解 RecyclerView 的绘制流程和滑动原理,android应用开发教程答案

android 程序员 移动开发

模板方法模式,flutter刷新机制

android 程序员 移动开发

正则表达式基础,记得把每一次面试当做经验积累

android 程序员 移动开发

毕业3年,我是如何从年薪10W的拖拽工程师成为30W资深Android开发者!

android 程序员 移动开发

流媒体协议之WebRTC实现p2p视频通话(二),kotlin数组转集合

android 程序员 移动开发

深入解析Android的StateListDrawable,【工作感悟】

android 程序员 移动开发

求职注意事项:Android面试中不可犯的这些“九大失误,Android常用面试

android 程序员 移动开发

浅析NestedScrolling嵌套滑动机制之实践篇-仿写饿了么商家详情页

android 程序员 移动开发

深入浅出,Andorid 端屏幕采集技术实践(1),android面试题整理最新

android 程序员 移动开发

深入浅出,Andorid 端屏幕采集技术实践,附大厂真题面经

android 程序员 移动开发

横向对比Jetpack、RxJava、Glide框架中对组件生命周期Lifecycle感知原理

android 程序员 移动开发

毕业6年,技术人的不惑之路,移动app开发工具

android 程序员 移动开发

  • 扫码添加小助手
    领取最新资料包
微软在C# 8中引入预览版可空引用类型_.NET_Abel Avram_InfoQ精选文章