快速了解C# 8.0中“可空引用类型(Nullable reference type)”语言特性
Visual C# 8.0中引入了可空引用类型(Nullable reference type),通过编译器提供的强大功能,帮助开发人员尽可能地规避由空引用带来的代码问题。这里我大致介绍一下可空引用类型的基本内容。
刚开始接触这个语言特性的时候,可能会不太容易理解。引用类型本来不就是可以为空(null)的么,为啥还要特别地引入“可空引用类型”的概念呢?其实这是从编译器的角度要求开发人员在编程的时候就考虑某个变量是否有可能为空,从而尽可能地减少由空引用所带来的代码错误。
假设有如下类:
class Student
{
public Student(string name, DateTime dayOfBirth)
=> (Name, DayOfBirth) = (name, dayOfBirth);
public string Name { get; set; }
public DateTime DayOfBirth { get; set; }
public string Notes { get; set; }
}
此类定义了一个“学生”实体的基本信息,为了简化起见,这里只列出了需要讨论的几个属性:
- Name:学生姓名
- DayOfBirth:学生生日
- Notes:对学生信息的一些备注
假设我们有两个操作:在所有学生中,找出所有具有备注信息的学生,以及对所有学生按姓名排序,在C#中很容易使用Linq来实现:
var studentsHasNotes = students.Where(s => s.Notes.Length > 0);
以及:
var orderedStudents = students.OrderBy(s => s.Name);
到目前为止没啥问题,程序能够正常运行。然而仔细进行代码审查不难发现,在获取所有具有备注信息的学生的代码中(也就是上面第一段代码中),有可能出现空引用的异常,因为对于一个“学生”实体来说,它的Notes属性是有可能为null的。
现在我们打开“可空引用类型”这一语言特性,打开方式主要有两种:可以在项目级别,编辑csproj项目文件进行设置,也可以通过#nullable预编译指令来实现:
- 编辑csproj项目文件,加入
<Nullable>enable</Nullable>
即可:
- 通过#nullable预编译指令来实现,只需要在代码中需要的地方加入#nullable指令即可:
启用“可空引用类型”这一语言特性之后你会发现,在上面的Student类的构造函数处出现了一个警告,提示在构造函数执行完成时,不可为空的“Notes”属性需要有一个不为空的值,建议将其设置为可空的string类型。为什么编译器仅提示Notes有可能为空,而不是Name属性呢?因为构造函数中已经为Name赋值了,因此,对于任何一个Student的对象,Name不可能为空,而Notes则不然。
Name不可能为空?它不是string类型么?万一在代码中它为空了怎么办?别急,编译器是不会允许出现这种情况的:
在此,我们将Notes属性设置为string?
类型,于是你会发现,位于构造函数上的警告信息已经没有了,因为我们允许Student对象可以没有Notes数据,但在“找出所有具有备注信息的学生”这一操作时,又会出现警告,提示说Notes有可能为空:
于是,你会发现,在启用了可空引用类型的语言特性后,我们就需要仔细考察Student类型中的每一个引用类型的属性,看它在实际应用中是否有可能为空,如果可能为空,则用可空引用类型来定义属性,之后编译器就会帮助你来分析哪些地方有可能存在空引用。
在上面的“找出所有具有备注信息的学生”例子中,如果你觉得Notes肯定不会为空,那么也可以使用“!”操作符来覆盖编译器的警告信息,比如:
现在流行的.NET开源框架基本上都已经支持了可空引用类型了,而且如果你是一名开源框架的开发人员,也强烈建议在你的框架中启用这一语言特性来尽可能地避免空引用问题。比如,如果你在代码中启用了可空引用类型特性,那么当你从Newtonsoft.Json的JsonConverter类继承时,你会发现,你必须使用可空引用类型的函数重载:
但如果你没有启用可空引用类型特性,那么当你从Newtonsoft.Json的JsonConverter类继承时,你会发现,重载函数的签名与以前一样:
好了,对于C# 8.0的“可空引用类型”大致就介绍这么多,相信应该已经基本上概括了它的要点和使用方式,在日常开发中应该够用了。
快速了解C# 8.0中“可空引用类型(Nullable reference type)”语言特性的更多相关文章
- [译]C#8.0中一个使接口更加灵活的新特性-默认接口实现
9月份的时候,微软宣布正式发布C#8.0,作为.NET Core 3.0发行版的一部分.C#8.0的新特性之一就是默认接口实现.在本文中,我们将一起来聊聊默认接口实现. 众所周知,对现有应用程序的接口 ...
- C#中的值类型(value type)与引用类型(reference type)的区别
ylbtech- .NET-Basic:C#中的值类型与引用类型的区别 C#中的值类型(value type)与引用类型(reference type)的区别 1.A,相关概念返回顶部 C#中 ...
- 【Unity3D】中的空引用 Null Reference Exception
Null Reference Exception : Object reference not set to an instance of an object. 异常:空引用,对象的引用未设置到对象的 ...
- Nullable Reference Types 可空引用类型
在写C#代码的时候,你可能经常会遇到这个错误: 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作. 可空引用类型 Null Reference Type 所以, ...
- C# 8 - Nullable Reference Types 可空引用类型
在写C#代码的时候,你可能经常会遇到这个错误: 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作. 可空引用类型 Null Reference Type 所以, ...
- 迫不及待地体验了一把 C#8.0 中的可空引用类型(Nullable Reference)
在我之前的一篇博客 NullReferenceException,就不应该存在! 中,我吐槽了 C# 中 null 的弊端以及避免 null 的方法:事实上这本都是现代高级语言中极力推崇的做法.Kot ...
- C#8.0可空引用类型的使用注意要点
最近VS2019正式版发布了,装下来顺便试用了一下C#8.0,最大的看点应该就是可空引用类型了.不过C#8.0仍然处于Beta的状态,而且试用时也遇到了几个坑. 背景知识说明: 所谓的可空引用类型是指 ...
- C#3.0中的扩展方法
在实际应用中,开发者完成代码的编译后,除非重新编译更改后的代码,否则开发者很难在原有代码中添加新的功能. 在C#3.0中,提供了一个扩展方法的新特性,可以使得开发者在编译后的程序集里边添加相关的方法, ...
- vue2.0中使用less
第一部分:Less语言 与上一篇<vue2.0中使用sass>介绍的Sass语言一样,Less语言也是一种CSS的扩展语言,增加了变量.混合(minin).函数等功能,让CSS更易维护.方 ...
随机推荐
- 在Python里,用股票案例讲描述性统计分析方法(内容来自我的书)
描述性统计是数学统计分析里的一种方法,通过这种统计方法,能分析出数据整体状况以及数据间的关联.在这部分里,将用股票数据为样本,以matplotlib类为可视化工具,讲述描述性统计里常用指标的计算方法和 ...
- matplotlib 单figure多图
method 1 import numpy as np import matplotlib.pyplot as plt fg, axes = plt.subplots(1, 2, figsize=(1 ...
- base 64 bug & encodeURIComponent
base64 bug & encodeURIComponent window.btoa("jëh²H¶�%28"); // "autoskiptoclMjiu&q ...
- how to create one single-file Web Component just using the HTML, CSS, JavaScript
how to create one single-file Web Component just using the HTML, CSS, JavaScript web components html ...
- js 裁剪图片
js 裁剪图片 https://gugeji.com/search?q=js剪切图片
- 2019 front-end job Interview
2019 front-end job Interview 2019 前端面试题 掘金 https://juejin.im/tag/面试 https://juejin.im/post/5c875791e ...
- 1月加密货币交易所访问量破3亿!NGK生态星空计划、NGK生态所带来双重利好!
据最新数据显示,2021年一月份,加密货币交易所网站的访问量急剧上升.约有3.44亿访问者涌入了加密货币交易所,超过2020年12月的1.96亿访问者总数,创2018年1月以来新高. 加密货币交易所网 ...
- NGK高效的背后驱动力是社区发展
社区是公有链生态系统中最重要的部分,如果开发了区块链应用或工具,却没有用户使用,那将毫无价值.因此对公链项目来说首先需要构建用户群,并深入研究用户群体的需求.就目前而言,任何项目都需要社区力量加入项目 ...
- C++算法代码——奖学金
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1098 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学 ...
- 🤔 移动端 JS 引擎哪家强?美国硅谷找......
如果你喜欢我写的文章,可以把我的公众号设为星标 ,这样每次有更新就可以及时推送给你啦 在一般的移动端开发场景中,每次更新应用功能都是通过 Native 语言开发并通过应用市场版本分发来实现的.但是市场 ...