前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >迫不及待地体验了一把 C#8.0 中的可空引用类型(Nullable Reference)

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

作者头像
walterlv
发布2020-02-10 13:48:07
5770
发布2020-02-10 13:48:07
举报

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

发布于 2017-12-18 21:41 更新于 2018-12-14 01:54

在我之前的一篇博客 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://blog.walterlv.com/post/nullable-

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-12-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 迫不及待地体验了一把 C#8.0 中的可空引用类型(Nullable Reference)
    • 安装可空引用类型预览包
      • 体验可空引用类型的作用
        • 丢不掉的兼容性包袱
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档