C# 8 新特性 - 可空引用类型

Nullable Reference Type.

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

640?wx_fmt=png

 

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

 

可空引用类型 Null Reference Type 

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

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

 

看下面这个例子: 

640?wx_fmt=png

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

 

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

640?wx_fmt=png

 

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

640?wx_fmt=png

 

打开null检查 

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

640?wx_fmt=png

 

640?wx_fmt=png

这里就会出现警告。 

 

例子: 

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

640?wx_fmt=png

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

640?wx_fmt=png

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

 

成员可能是null 

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

640?wx_fmt=png

 

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

640?wx_fmt=png

 

然后再看一下这个方法: 

640?wx_fmt=png

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

 

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

640?wx_fmt=png

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

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

640?wx_fmt=png

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

 

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

 

成员不可能是null 

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

640?wx_fmt=png

类成员又出现了警告。 

 

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

640?wx_fmt=png

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

 

解决成员上出现的警告 

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

640?wx_fmt=png

 

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

640?wx_fmt=png

 

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

 

往构造函数里传递null 

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

640?wx_fmt=png

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

 

另一种开启nullable检查的方式 

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

640?wx_fmt=png

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

 

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

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

640?wx_fmt=png

 

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

640?wx_fmt=png

 

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

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

640?wx_fmt=png

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring boot starter

1:Spring boot starter及项目中的类似运用 1:Spring boot starter的两种方式 引入pom文件,自动管理jar版本根据spring.factories配置文件,加载config的各种bean spring boot约定大于配置理念在这里有体现。 2:项目…

统计学习笔记(1) 监督学习概论(1)

原作品:The Elements of Statistical Learning Data Mining, Inference, and Prediction, Second Edition, by Trevor Hastie, Robert Tibshirani and Jerome Friedman An Introduction to Statistical Learning. by Gareth JamesDaniela WittenTrevor Hastie andR…

.NET Core 3.0之深入源码理解ObjectPool(一)

写在前面对象池是一种比较常用的提高系统性能的软件设计模式,它维护了一系列相关对象列表的容器对象,这些对象可以随时重复使用,对象池节省了频繁创建对象的开销。它使用取用/归还的操作模式,并重复执行这些操作。如下图所示&…

查看日志文件的方法

对于一般大小的日志文件,直接使用tail命令即可。 对于大日志文件,并且还在不停刷新的,使用more或less命令 对于很大的log文件用more不能直接跳到文件末尾向前查看。 这时可以用less来查看文件时,在command模式下按G跳到文件末尾&…

Deep Boltzmann Machines

转载自:http://blog.csdn.net/win_in_action/article/details/25333671 http://blog.csdn.net/zouxy09/article/details/8775518 深度神经网络(Deep neural network) 深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种…

生产问题

1:MQ过快 有个业务场景是:先创建一条记录(1),然后发mq,最后更新这条记录的状态(2)。 收到mq之后,再更新状态(3)。 问题出在mq快于本地事务&…

.NET斗鱼直播弹幕客户端(下)

前言在上篇文章中,我们提到了如何使用 .NET连接斗鱼TV直播弹幕的基本操作。然而想要做得好,做得容易扩展,就需要做进一步的代码整理。本文将涉及以下内容:介绍如何使用 ReactiveExtensions( Rx)&#xff0c…

字符串的排列

题目描述 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。 换句话说,第一个字符串的排列之一是第二个字符串的子串。 示例1: 输入: s1 “ab” s2 “eidbaooo” 输出: True 解释: s2 包含 s1 的排列之一 (“ba”). 示例2: 输入: …

【 .NET Core 3.0 】框架之十 || AOP 切面思想

本文有配套视频:https://www.bilibili.com/video/av58096866/?p6前言上回《【 .NET Core3.0 】框架之九 || 依赖注入IoC学习 AOP界面编程初探》咱们说到了依赖注入Autofac的使用,不知道大家对IoC的使用是怎样的感觉,我个人表示还是比较可行…

[ASP.NET Core 3框架揭秘] 跨平台开发体验: Docker

对于一个 .NET Core开发人员,你可能没有使用过Docker,但是你不可能没有听说过Docker。Docker是Github上最受欢迎的开源项目之一,它号称要成为所有云应用的基石,并把互联网升级到下一代。Docker是dotCloud公司开源的一款产品&#…

翻转字符串里的单词

问题描述 示例 1: 输入: "the sky is blue" 输出: "blue is sky the"示例 2: 输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字…

统计学习笔记(4) 线性回归(1)

Basic Introduction In this chapter, we review some of the key ideas underlying the linear regression model, as well as the least squares approach that is most commonly used to fit this model. Basic form: “≈” means “is approximately modeled as”, to …

简化路径

题目描述 以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…&#xf…

敏捷这么久,你知道如何开敏捷发布火车吗?

译者:单冰从事项目管理十几年,先后管理传统型项目团队及敏捷创新型团队。负责京东AI事业部敏捷创新、团队工程效率改进及敏捷教练工作。曾经负责手机端京东App项目管理工作5年,带领千人团队实施敏捷转型工作,版本发布从2个月提升为…

Newton Method in Maching Learning

牛顿方法:转自http://blog.csdn.net/andrewseu/article/details/46771947 本讲大纲: 1.牛顿方法(Newton’s method) 2.指数族(Exponential family) 3.广义线性模型(Generalized linear models) 1.牛顿方法 假设有函数:,我们希…

复原IP地址

1.题目描述 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。 示例: 输入: "25525511135" 输出: ["255.255.11.135", "255.255.111.35"]2.解法 2.1 回溯剪枝法 private int n;private String s;private Linked…

一键分享博客或新闻到Teams好友或频道

在最近的开发者工具更新中,Teams提供了一个Share to Teams的能力,就是在你的网页上面,放置一个按钮,用户点击后,就可以很方便地将当前网页或者你指定的其他网页,分享到Teams好友或频道中。这个开发文档在这…

C#刷遍Leetcode面试题系列连载(3): No.728 - 自除数

点击蓝字“dotNET匠人”关注我哟加个“星标★”,每日 7:15,好文必达!前言前文传送门:上篇文章中我们分析了一个递归描述的字符串问题,今天我们来分析一个数学问题,一道除法相关的面试题。今天要给大家分析的…

GPU Shader 程序调试方法

转载自: http://blog.csdn.net/pizi0475/article/details/7573939 内容提要:手动调试和使用工具PIX调试Direct3D程序。 3D绘图中常见问题: 1.模型消失,没有出现在画面上; 2.模型在画面上失真…

【.NET Core 3.0】框架之十二 || 跨域 与 Proxy

本文有配套视频:https://www.bilibili.com/video/av58096866/?p8一、为什么会出现跨域的问题跨域问题由来已久,主要是来源于浏览器的”同源策略”。何为同源?只有当协议、端口、和域名都相同的页面,则两个页面具有相同的源。只要…