迫不及待地体验了一把 C#8.0 中的可空引用类型(Nullable Reference)

迫不及待地体验了一把 C#8.0 中的可空引用类型(Nullable Reference)

发布于 2017-12-18 13:41 更新于 2017-12-19 00:36

在我之前的一篇博客 NullReferenceException,就不应该存在! 中,我吐槽了 C# 中 null 的弊端以及避免 null 的方法;事实上这本都是现代高级语言中极力推崇的做法。Kotlin 和 Swift 自诞生之日起引用类型就不能为空,C# 背着历史的包袱直到 8.0 才开始这么做……


安装可空引用类型预览包

现在 C#8.0 还没有发布,但微软已经提供了预览的扩展包,让大家体验效果并予以反馈

扩展包下载地址:2017年11月5日版本 - 最新版

下载解压后直接双击 install.bat 安装即可体验(安装前退出所有 Visual Studio)。这还是预览版,还有很多已知 BUG,修复后才会发布哦!


体验可空引用类型的作用

现在,再写一个新类的时候,Visual Studio 会为我们提示非空引用类型未初始化,并给出建议。

采纳它的建议,生成构造函数:

如果我们认为这个属性可以为 null,那么就可以添加 ? 使此属性的类型变为可空引用类型。

这时,如果在非 null 的地方使用此属性,则会要求判空。


丢不掉的兼容性包袱

由于有兼容性的包袱(至少得让你写了数月几年的项目编译通过吧),所以 C#8.0 的可空引用类型仅仅是“契约”的作用,并不能在编译级别阻止对非空引用类型的 null 赋值。而且目前为止也没有提供编译级别报错的选项。

已有的程序集没有标记那些非空哪些可空,那么 C#8.0 又怎么看呢(其实应该问 Roslyn 怎么看)?它只能默认所有的类型都是非空的,于是会给你警告,就像这样:

很明显,string.IsNullOrEmpty 是接受 null 值的,然而改不了现有程序集,于是这样的标记也没有用。

从现在看来,我们只能把它当作 Code Contracts 的语法版本。


参考资料

本文会经常更新,请阅读原文: https://walterlv.com/post/nullable-reference-in-csharp.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王磊的博客

Spring Boot 最佳实践(三)模板引擎FreeMarker集成

FreeMarker是一款免费的Java模板引擎,是一种基于模板和数据生成文本(HMLT、电子邮件、配置文件、源代码等)的工具,它不是面向最终用户的,而是一款程...

38240
来自专栏为数不多的Android技巧

我为Dexposed续一秒——论ART上运行时 Method AOP实现

两年前阿里开源了Dexposed 项目,它能够在Dalvik上无侵入地实现运行时方法拦截,正如其介绍「enable ‘god’ mode for single ...

33320
来自专栏web编程技术分享

用大白话聊聊JavaSE -- 自定义注解入门

30450
来自专栏流媒体

Json海量数据解析Json海量数据解析

​ 在android开发中,app和服务器进行数据传输时大多数会用到json。在解析json中通常会用到以下几种主流的解析库:jackson、gson、fa...

18320
来自专栏Ryan Miao

添加PMD插件扫描潜在的bug

上一节使用checkstyle来规范你的项目主要解决了代码编码规范问题,比如缩进换行等。这次继续代码健康工具类PMD。

14530
来自专栏喔家ArchiSelf

全栈Python 编程必备

Python作为一种编程语言,被称为“胶水语言”,更被拥趸们誉为“最美丽”的编程语言,从云端到客户端,再到物联网终端,无所不在,同时还是人工智能优选的编程语言。

52450
来自专栏机器之心

资源 | 简单快捷的数据处理,数据科学需要注意的命令行

16850
来自专栏Android机动车

设计模式——代理模式

现在有个非常流行的程序叫做面向切面编程(AOP),其核心就是采用了动态代理的方式。怎么用?Java为我们提供了一个便捷的动态代理接口 InvocationHan...

11010
来自专栏用户2442861的专栏

gcc和g++的区别

gcc 最开始的时候是 GNU C Compiler, 如你所知,就是一个c编译器。但是后来因为这个项目里边集成了更多其他不同语言的编译器,GCC就代表 the...

70210
来自专栏Micro_awake web

一些关于python的小感想

python是一门优秀的语言,但随之而来的是大量的知识,各种模块,相信一个人的大脑是很难记住如此多的内容。这时后的我们就应该想办法避免去记忆这么多的内容。 1。...

22170

扫码关注云+社区

领取腾讯云代金券