在写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检查。

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

Nullable Reference Types 可空引用类型的更多相关文章

  1. C# 8 - Nullable Reference Types 可空引用类型

    在写C#代码的时候,你可能经常会遇到这个错误: 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作. 可空引用类型 Null Reference Type 所以, ...

  2. 【译】尝试使用Nullable Reference Types

    随着.NET Core 3.0 Preview 7的发布,C#8.0已被认为是“功能完整”的.这意味着它们的最大亮点Nullable Reference Types,在行为方面也被锁定在.NET Co ...

  3. 初探 C# 8 的 Nullable Reference Types

    溫馨提醒:本文提及的 C# 8 新功能雖已通過提案,但不代表將來 C# 8 正式發布時一定會納入.這表示我這篇筆記有可能白寫了,也表示您不必急著瞭解這項新功能的所有細節,可能只要瞄一下底下的「概要」說 ...

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

    在我之前的一篇博客 NullReferenceException,就不应该存在! 中,我吐槽了 C# 中 null 的弊端以及避免 null 的方法:事实上这本都是现代高级语言中极力推崇的做法.Kot ...

  5. C# 8中的可空引用类型

    原文:Nullable Reference Types In C# 8 作者:.NET Core Tutorials 译者:Lamond Lu 现状 可空引用类型? 自从我开始学习.NET, 引用类型 ...

  6. 快速了解C# 8.0中“可空引用类型(Nullable reference type)”语言特性

    Visual C# 8.0中引入了可空引用类型(Nullable reference type),通过编译器提供的强大功能,帮助开发人员尽可能地规避由空引用带来的代码问题.这里我大致介绍一下可空引用类 ...

  7. Java中的原始类型(Primitive Types)与引用类型(Reference Values)

    Java虚拟机可以处理的类型有两种,一种是原始类型(Primitive Types),一种是引用类型(Reference Types). 与之对应,也存在有原始值(Primitive Values)和 ...

  8. iOS: 学习笔记, 值与引用类型(译自: https://developer.apple.com/swift/blog/ Aug 15, 2014 Value and Reference Types)

    值和引用类型 Value and Reference Types 在Swift中,有两种数据类型. 一是"值类型"(value type), 它是每一个实例都保存有各自的数据,通常 ...

  9. C# 可空引用类型

    可空引用类型是C#8.0计划新增的一个功能,不过已经发布了预览版本,今天我们来体验一下可空引用类型. 安装 您必须下载Visual Studio 2017 15.5预览版(目前最新发布版本是15.4) ...

随机推荐

  1. Jmeter基础教程图文版(二)- 核心组件

    ⚪Jmeter Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具.用于对软件做压力测试,它最初被设计用于 Web 应用测试,但后来扩展到其他测试领域. 它可以用于 ...

  2. Linux root 用户下 selenium 运行chrome --no-sandbox的问题的解决

    #coding = utf-8 from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_opt ...

  3. 关于volatile关键字的最佳解释

    直接放原博主链接,真的写得非常好,看懂这个面试官问再多也不怕了: https://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatil ...

  4. C# 表达式树分页扩展(三)

    一.前言 前面我们知道了表达树的基本知识,也明白了怎么遍历和修改一个表达式,这里我们就一个实际的场景来进行功能开发. 表达式系列目录 C# 表达式树讲解(一) C# 表达式树遍历(二) C# 表达式树 ...

  5. Django之使用内置函数和celery发邮件

    邮箱配置 开启stmp服务 以163邮箱为例,点击设置里面的stmp 开启客户端授权密码 如上所示,因为我已经开启了,所以出现的是以上页面. 这样,邮箱的准备就已经完成了. 使用Django内置函数发 ...

  6. Windows 7 上怎样打开SQL Server 配置管理器

    场景 在Windows 7 上打开 SQL Server 的配置管理器. 实现 右击电脑--管理 在计算机管理--服务和应用程序-SQL Server 配置管理器 注: 博客首页: https://b ...

  7. 3.1、双向循环链表(java实现)

    1.创建节点类 public class CNode<T> { public CNode prev; public CNode next; public T data; public CN ...

  8. nodejs实现聊天机器人

    技术栈 服务端: koa.koa-route.koa-websocket.request. 客户端: html.css.js.websocket. 远程聊天API: http://api.qingyu ...

  9. 宝锋UV-5R说明书下载

    宝锋UV-5R说明书 百度网盘下载地址: 链接: https://pan.baidu.com/s/1QJXEJ2YyO7ovMAQG7Uur4A 提取码: j8d2 BI8EJM     73    ...

  10. 一文读懂NodeJS全栈开发利器:CabloyJS(万字长文)

    目录 0 修订 0.1 修订说明 0.2 修订历史 1 基本概念 1.1 CabloyJS是什么 1.2 CabloyJS核心解决什么问题 1.3 CabloyJS的开发历程 2 数据版本与开发流程 ...