Nullable Reference Type.

在写C#代码的时候,你可能经常会遇到这个错误:

但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作。

可空引用类型 Null Reference Type

所以,C# 8的可空引用类型就出现了。

C# 8可以让你在编译时就避免null引用错误,它并不是把null值从代码里移除了,而是它可以让你表达意图。具体的做法就是你可以告诉编译器哪个引用可能是null的,而哪些引用不可能是null。

看下面这个例子:

很显然,我们期待person这个参数它不可以是null的。

但是在C# 8之前,如果我们这样调用该方法,那么在编译时是不会报错的:

而如果运行程序,那么结果就是:

打开null检查

而在Visual Studio 2019里面(C# 8的项目),修改项目文件,添加null检查之后:

这里就会出现警告。

例子:

有两个类,Person类的Address属性的类型是另外一个类:

现在可以看到,这些属性都出现了波浪线的警告,如果我们build一下这个项目,那么也会出现很多警告:

这是因为我们把这两个类的成员声明称了非null的引用类型,而我却没有对它们进行初始化。

成员可能是null的

如果我想让这些成员可以为null(意图上),那么就需要把它们设置为可null的(意图),在类型后边加上问号“?”即可:

再次build项目之后,警告都没有了:

然后再看一下这个方法:

这里person.Address.Province有一个警告,是因为Address可能是null。

可以有几种办法把这个警告去掉,首先是使用null条件操作符:

如果是Address是null的话,就输出null。

或者,如果你确认Address属性不会是null,那么可以在Address后添加一个叹号”!“,表示Address肯定不是null:

这个叹号的作用仅仅是去掉了警告,它没有改变任何运行时的状况,如果Address为null,那么这句话仍然会抛出NullReferenceException。

所以,只有确认我们访问的东西肯定不是null的时候,才应该使用"!"。

成员不可能是null

下面我更改一下思路意图,假设所有的成员都不可能为null,那么修改两个类:

类成员又出现了警告。

而回到方法里,我把叹号和问号都去掉之后,也不会出现警告了,因为它认为所有的成员都不会是null了:

但是还要记住,这个只是在编译时进行的检查,如果成员为null,还是会抛出异常的。这种操作对于运行时来说没有任何改变。

解决成员上出现的警告

使用构造函数对成员初始化,可以去掉这些警告:

另外一种办法就是直接对属性进行初始化:

我们还是采用构造函数初始化的办法吧。

往构造函数里传递null

那么往构造函数里面传递null会出现什么情况呢?试一下:

提示还是比较智能的,有警告,它说无法把null这个字面值转化为非null的引用类型。

另一种开启nullable检查的方式

如果把老项目的项目文件直接添加以下内容:

那么项目在编译的时候很可能出现大规模的问题。

所以一点一点启用nullable检查是比较好的做法。

首先我把项目文件恢复原状,然后打开某个文件,在文件最上面添加以下内容:

然后在文件的最下面添加:

这样的话,这个文件里面所有的内容都开起了nullable检查。

或者,我们也可以只针对一段代码进行检查:

C# 8 新特性 - 可空引用类型相关推荐

  1. Oracle11g新特性导致空表不能导出问题

        ORACLE 11G在用EXP导出时,发现空表(没有数据或者没有用过的表)不能导出了. 查了一下资料,说是Oracle 11G中有个新特性,当表无数据时,不分配segment,以节省空间,所以 ...

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

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

  3. 浅谈php7的重大新特性_PHP7的新特性和源码结构

    一.PHP7的新特性 返回值类型声明 类型声明有两种模式: 弱类型校验模式(默认):当传入的参数不符合声明类型时,会首先尝试转换类型. 严格类型校验模式:当传入的参数不符合声明类型时,直接报错. 声明 ...

  4. .NET 6新特性试用 | 可空引用类型

    前言 在查看<隐式using指令>功能时,我们在csproj中发现这样一个属性: 那么,Nullable到底是干嘛的? 可为空上下文 严格来说,这不是新特性,而是C# 8.0引入的特性之一 ...

  5. 分析 C# 2.0 新特性 -- 空类型(Nullable Types)

    分析 C# 2.0 新特性  -- 空类型(Nullable Types) 在讨论C# 2.0 空类型前,先回顾一下.NET 1.0和.NET 1.1对于类型有下面这样的定义: ".NET  ...

  6. Oracle 11gR2新特性--延迟段创建(Deferred Segment Creation)和exp不能导出空表

    Oracle 11gR2新特性--延迟段创建(Deferred Segment Creation)和exp不能导出空表 真题1. 什么是延迟段创建(Deferred Segment Creation) ...

  7. JAVA8新特性之 判断 list 是否为空进行 foreach 遍历

    JAVA8新特性之 判断 list 是否为空进行 foreach 遍历 ArrayList<String> dateList = new ArrayList<>(); Opti ...

  8. C# 8.0的三个令人兴奋的新特性

    C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新.同时,C# 每个版本的发布都与同时期的 Visual Studio 以及 .NET 运行时版本高 ...

  9. C++11 的新特性

    C++11 的新特性 1 变量和基本类型 1.1 long long 类型 扩展精度浮点数,10位有效数字 1.2 列表初始化 初始化的几种不同形式,其中用花括号来初始化变量称为列表初始化: 比如: ...

最新文章

  1. 如何发布你的Android应用程序
  2. [译]关于NODE_ENV,哪些你应该了解
  3. 《NoSQL权威指南》导读
  4. vb.net 数据集设计器 新增列_SQLPro for MSSQL for Mac(数据库客户端)
  5. Vue 单文件中的数据传递
  6. 微信小程序报thirdScriptError Cannot read property 'setData' of undefined
  7. windows下用XShell远程ubuntu时连接失败
  8. 电力物联网智慧路灯充电桩传感器技术应用方案
  9. ARM平台交叉编译valgrind
  10. 电脑手写输入法_5款好用的拼音输入法软件推荐
  11. LCD1602----LiquidCrystal库的使用2
  12. js刷新当前页面的5种方式
  13. php 博饼 源代码,php实现中秋博饼小游戏
  14. SageMath矩阵操作及解线性方程组
  15. ORacle异常:ORA-00980:同义词转换不再有效
  16. Python学习-小黑屋游戏
  17. JAVA作业三:教练与运动员案例
  18. 重温数据结构(C语言版)(第二版)
  19. 去除bootstrap的table样式中单元格边框线
  20. 2018年广东工业大学文远知行杯新生程序设计竞赛 1013 在那天的雪停息之前β

热门文章

  1. [WCF安全系列]认证与凭证:用户名/密码认证与Windows认证
  2. Linux服务器数据备份
  3. 编码GBK的不可映射字符
  4. XHTML教会我的一些东西-1
  5. 如何理解 C# 中的 System.Void 类型?
  6. 我做的百度飞桨PaddleOCR .NET调用库
  7. Magicodes.IE 2.5.6.2发布
  8. WPF 跟随拖动改变的三次贝塞尔曲线思路
  9. 为啥 .NET 自带的 JsonSerializer 无法序列化 Field ?
  10. 应对「高并发」的思路