Nullable Reference Types 可空引用类型
在写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 可空引用类型的更多相关文章
- C# 8 - Nullable Reference Types 可空引用类型
在写C#代码的时候,你可能经常会遇到这个错误: 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作. 可空引用类型 Null Reference Type 所以, ...
- 【译】尝试使用Nullable Reference Types
随着.NET Core 3.0 Preview 7的发布,C#8.0已被认为是“功能完整”的.这意味着它们的最大亮点Nullable Reference Types,在行为方面也被锁定在.NET Co ...
- 初探 C# 8 的 Nullable Reference Types
溫馨提醒:本文提及的 C# 8 新功能雖已通過提案,但不代表將來 C# 8 正式發布時一定會納入.這表示我這篇筆記有可能白寫了,也表示您不必急著瞭解這項新功能的所有細節,可能只要瞄一下底下的「概要」說 ...
- 迫不及待地体验了一把 C#8.0 中的可空引用类型(Nullable Reference)
在我之前的一篇博客 NullReferenceException,就不应该存在! 中,我吐槽了 C# 中 null 的弊端以及避免 null 的方法:事实上这本都是现代高级语言中极力推崇的做法.Kot ...
- C# 8中的可空引用类型
原文:Nullable Reference Types In C# 8 作者:.NET Core Tutorials 译者:Lamond Lu 现状 可空引用类型? 自从我开始学习.NET, 引用类型 ...
- 快速了解C# 8.0中“可空引用类型(Nullable reference type)”语言特性
Visual C# 8.0中引入了可空引用类型(Nullable reference type),通过编译器提供的强大功能,帮助开发人员尽可能地规避由空引用带来的代码问题.这里我大致介绍一下可空引用类 ...
- Java中的原始类型(Primitive Types)与引用类型(Reference Values)
Java虚拟机可以处理的类型有两种,一种是原始类型(Primitive Types),一种是引用类型(Reference Types). 与之对应,也存在有原始值(Primitive Values)和 ...
- iOS: 学习笔记, 值与引用类型(译自: https://developer.apple.com/swift/blog/ Aug 15, 2014 Value and Reference Types)
值和引用类型 Value and Reference Types 在Swift中,有两种数据类型. 一是"值类型"(value type), 它是每一个实例都保存有各自的数据,通常 ...
- C# 可空引用类型
可空引用类型是C#8.0计划新增的一个功能,不过已经发布了预览版本,今天我们来体验一下可空引用类型. 安装 您必须下载Visual Studio 2017 15.5预览版(目前最新发布版本是15.4) ...
随机推荐
- Codeforces Round #483 (Div. 2) B. Minesweeper
题目地址:http://codeforces.com/contest/984/problem/B 题目大意:扫雷游戏,给你一个n*m的地图,如果有炸弹,旁边的八个位置都会+1,问这幅图是不是正确的. ...
- Atcoder E - Meaningful Mean(线段树+思维)
题目链接:http://arc075.contest.atcoder.jp/tasks/arc075_c 题意:问数组a有多少子区间平均值为k 题解:一开始考虑过dp,但是显然不可行,其实将每一个数都 ...
- codeforces 509 E. Pretty Song(前缀和+前缀和的前缀和)
题目链接:http://codeforces.com/problemset/problem/509/E 题意:给你一个字符串,求字串中包括子串中I, E, A, O, U, Y.所占的概率和. 题解: ...
- 牛客网暑期ACM多校训练营(第二场) I Car 思维
链接:https://www.nowcoder.com/acm/contest/140/I来源:牛客网 White Cloud has a square of n*n from (1,1) to (n ...
- webstrom 内存溢出,软件崩溃卡死解决的方法
今天用gulp搭建了一个工程,准备做一个体育h5的项目,其中需要用到sass代码压缩,加版本号等功能. gulpfile.js和package.json都是已经写好的.我用CMD命令窗口cnpm安装n ...
- 【Offer】[66] 【构建乘积数组】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给定一个数组A[0, 1, -, n-1],请构建一个数组B[0, 1, -, n-1],其中B中的元素B[i] =A[0]×A[1]× ...
- Java网络编程 -- Netty入门
Netty简介 Netty是一个高性能,高可扩展性的异步事件驱动的网络应用程序框架,它极大的简化了TCP和UDP客户端和服务器端网络开发.它是一个NIO框架,对Java NIO进行了良好的封装.作为一 ...
- Apache JMeter (二)性能测试 入门实例
上一节我们说了关于Jmeter环境的配置,接下来讲一个测试的实例. 1.运行Jmeter 进入Jmeter程序所在目录,运行"bin/jmeter.bat" Jmeter支持中文, ...
- springboot 定时器 Schdule
定时器:定时启动任务,执行代码 1.在启动类中加入注解: 2.创建一个类,并且在这个类上加入注解:@Component 3.定义一个方法,在方法上加入注解:@Scheduled(cron=" ...
- java架构之路-(JVM优化与原理)JVM之G1回收器和常见参数配置
过去的几天里,我把JVM内部的垃圾回收算法和垃圾回收器.还剩下最后一个G1回收器没有说,我们今天数一下G1回收器和常见的参数配置. G1回收器 G1 (Garbage-First)是一款面向服务器的垃 ...