.NET 6学习笔记(4)——解决VS2022中Nullable警告
很多小伙伴在升级到Visual Studio 2022后发现,如果我们去新建一个.NET 6的项目,和原先VS2019中一摸一样的写法,却会出现CS8618 Non-nullable property或者其他可能为null的警告。虽然不影响代码的编译和运行,却让人心里不踏实。
这是因为VS2019除了.NET Core 3.x的项目类型,都是默认使用C# 7.3版本。而从C# 8.0之后,增加了对可为null类型的检查,旨在最大程度的减少运行时出现NullReference异常。
除非小伙伴们时刻关心C#版本更新内容,否则这个随着VS2022和.NET 6默认开启的新特性,可能带来的不是惊喜,反而有一点惊吓。
那么让我们来看看如何迎接这个新的改变。这个变化的主旨是希望代码中,尽可能不再有为null的情况。首先我们来看最常见的一个Warning,在属性声明的时候。

平平无奇的写法,其中却蕴藏着两个Warnings。这种的处理较为简单,给出明确的初始值即可。例如string.Empty。你可以觉得这是在脱裤子放屁,但是回过头想一想,在运行过程中FristName和LastName为“”的情况,一定是代码有意为之。而不是不知道哪里返回了一个null,且无意中赋值上去了。

第二种常见的情况,是我们获得了一个可为null类型的对象,然后直接使用了。下图中XDocument的Load方法返回了Xelement?类型的对象。如果我们不做null check,就会存在Warning的波浪线。

一般来说这里加个if判断,就完事了。至少这个方法本身算是交差了。就像Xdocument.Root这个属性一样。但是业务代码的设计,和基础框架API的设计在思路上是有区别的。业务代码在业务明确的情况下返回null,会造成一种无限套娃的微妙效果。就像下面这个,到了外面一层的使用方法,仍然要纠结于null check。

从这个方法看,如果我就是一定要获取Root对象,或者对Root对象做一些不可描述的事情。那么XML文件中root节点为空就是一个不可接受,完全错误的情况。我个人倾向直接throw NullReferenceException。

另一种相似的情况是,可空类型被作为参数在接下来的代码中使用。下面代码中的attribute在业务逻辑中,很有可能就不应该存在为null的情况。否则就是输入的源头有错误。

这时要么通过if来回避参数为null这个错误,要么干脆就把错误暴露出来。这里推荐使用ArgumentNullException的静态方法ThrowIfNull。比先写个if判断再throw的方式要省力得多。

Visual Studio通过代码静态分析来判断是否报告可为null的Warning。但是代码写起来是非常灵活的,所以有时候会有误报或者分析不出来的情况。比如下面这个例子。

明明已经对相同的对象做了null check,但仍然会有Warning,这是因为Visual Studio并不认为这两段重复的代码是同一个东西。处理的方式也很简单,一是老老实实通过建立局部变量的引用来避免重复。

二是通过惊叹号(!)操作符告诉Visual Studio,我确信这里没有问题,别逼逼了。所以可以有下面这个写法。当然我个人并不推荐这么做,首先是这个写法不兼容之前低版本的C#,万一要做一个向低版本的移植或兼容就麻烦了。其次!操作符有些过度自信的感觉,它没有实际的意义,仅仅是关闭了这个Warning,颇有掩耳盗铃的意思。

以上就是今天想和大家讨论的,关于迁移到Visual Studio 2022和C# 10以后,遇到的可为null类型的问题。持续性的学习不是说要每个小版本都紧跟潮流,而是在每一次的新项目,新团队,新机遇到来的时候,即时地更新自己。一点浅见,抛砖引玉。
以下链接,是MS Learn上Windows开发的入门课程,单个课程三十分钟到60分钟不等,想要补充基础知识的同学点这里:
开始使用 Visual Studio 开发 Windows 10 应用
.NET 6学习笔记(4)——解决VS2022中Nullable警告的更多相关文章
- 【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function
解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function https://www.cnblogs.com/jaso ...
- Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流)
1.File类:对硬盘上的文件和目录进行操作的类. File类是文件和目录路径名抽象表现形式 构造函数: 1) File(String pathname) Creat ...
- [C#] 类型学习笔记一:CLR中的类型,装箱和拆箱
在学习.NET的时候,因为一些疑问,让我打算把.NET的类型篇做一个总结.总结以三篇博文的形式呈现. 这篇博文,作为三篇博文的第一篇,主要探讨了.NET Framework中的基本类型,以及这些类型一 ...
- [原创]java WEB学习笔记39:EL中的运算符号(算术运算符,关系运算符,逻辑运算符,empty运算符,条件运算符,括号运算符)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记38:EL 中的 11个 隐含对象 详解
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记05:Servlet中的ServletConfig对象
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Android(java)学习笔记110:Java中操作文件的类介绍(File + IO流)
1.File类:对硬盘上的文件和目录进行操作的类. File类是文件和目录路径名抽象表现形式 构造函数: 1) File(String pathname) Creat ...
- Python学习笔记之从文件中读取数据
10-1 Python 学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python 知识,其中每一行都以“In Python you can”打头.将这个文件命名为learnin ...
- Docker学习笔记之-在CentOS中安装Docker
上一节演示了如何 通过Xshell连接CentOS服务,链接:Docker学习笔记之-通过Xshell连接 CentOS服务 本节将演示 如何在CentOS中安装 Docker 第一步:更新系统包到最 ...
随机推荐
- unity---3D数学基础
点乘 A·B 判断敌人在前方还是后方 调试画线 画线段 前两个参数 分别是 起点 终点 画射线 前两个参数 分别是 起点 方向 Debug.DrawLine(this.transform.positi ...
- Android Studio中一套代码多版本打包
一套代码达到以下效果: 打包不同applicationId能同时安装在同一手机上 不同logo,app名称, 不同第三方SDK接入配置(例如微信分享appid,激光推送appkey) 能区分debug ...
- Eoapi — 一个可拓展的开源 API 工具
在社区中时常会出现"抱怨某商业产品越来越臃肿"的声音,API 工具也是如此.从最早期只做 API 调试的工具,到经过多年的演进后集成全面功能的"庞然大物", ...
- CentOS搭建BWAPP靶场并安装docker
为了不触碰国家安全网络红线作为技术人员我们尽可能的要在自己本机在上面创建自己的靶场: 在centos上面搭建靶场看似非常简单短短几行代码,需要注意以下几个点:(1.在docker上搭建 2.端口号 ...
- 使用Node.js还可以发邮件
前言 今天,我们给大家开发一个小效果.篇幅比较短,主要给大家展示效果.实战 首先我们初始化一个Node项目 npm init -y 创建一个app.js文件 'use strict'; const n ...
- tableSizeFor
HashMap tableSizeFor() /** Returns a power of two size for the given target capacity. 1.(不考虑大于最大容量的情 ...
- WPF开发随笔收录-DataAnnotations实现数据校验(MVVM架构下)
一.前言 在自己的项目中挺多地方需要涉及到数据验证的,初期的实现方式都是通过点击确定后再逐个验证数据是否符合要求,但这种方式会让后台代码变得很多很乱.于是就开始在网上需求好的解决方式,刚好看到了一个大 ...
- DAST 黑盒漏洞扫描器 第六篇:运营篇(终)
0X01 前言 转载请标明来源:https://www.cnblogs.com/huim/ 当项目功能逐渐成熟,同时需要实现的是运营流程和指标体系建设.需要工程化的功能逐渐少了,剩下的主要工作转变成持 ...
- mysql-安装(windows版本)与登录
安装mysql 1.MySQL版本 mysql-5.6.35-winx64.zip 2.首先解压到安装目录 3.修改配置文件 复制my-default.ini 重命名为my.ini 然后修改mysql ...
- Python快速下载商品数据,并连接数据库,保存数据
开发环境 python 3.8 pycharm 2021.2 专业版 代码实现 发送请求 获取数据 解析数据(筛选数据) 保存数据 连接数据库 开始代码 请求数据 # 伪装 headers = { ' ...