.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 第一步:更新系统包到最 ...
随机推荐
- linux篇-linux 下建立多个tomcat
第一步:复制,解压 将准备好的tomcat压缩包复制到你准备安装的目录,我的tomcat压缩包名字是tomcat.tar.gz,我的安 装目录是 /usr/java/tomcat 第二步:解压tomc ...
- 个人冲刺(六)——体温上报app(二阶段)
冲刺任务:完成主页面功能 MainActivity.java package com.example.helloworld; import android.app.AlertDialog; impor ...
- 『忘了再学』Shell基础 — 20、Shell中的运算符
目录 1.Shell常用运算符 2.Shell中数值运算的方法 (1)方式一 (2)方式二 (3)方式三(推荐) 1.Shell常用运算符 Shell中常用运算符如下表: 优先级数值越大优先级越高,具 ...
- Java面试宝典学习笔记【2020】
Java面试题总结 一.Java基础 1)Java有没有goto? goto是C语言中的,通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能.Java保留了这个关键字但是没有使用 ...
- liunx 服务器下面安装mysql8.0
闲来无事,准备自己搭建一个服务器高点事情,不可避免的就是需要使用到mysql数据库了.在Linux系统安装MySQL8.0,网上已经有很多的教程了,到自己安装的时候却发现各种各样的问题,现在把安装过程 ...
- 『忘了再学』Shell基础 — 24、Shell正则表达式的使用
目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...
- 架构师必备:系统容量现状checklist
正如飞机在起飞前,机长.副机长要过一遍checklist检查,确认没问题了才能起飞.楼主也整理了一个系统容量现状checklist,方便对照检查.本文搭配架构师必备:如何做容量预估和调优,食用更佳. ...
- House of apple 一种新的glibc中IO攻击方法
目录 House of apple 一种新的glibc中IO攻击方法 前言 利用条件 利用原理 利用思路 思路一:修改tcache线程变量 思路二:修改mp_结构体 思路三:修改pointer_gua ...
- sharepoint 配置失败,已引发类型为System.ArgumentException的异常。其他异常信息:domainName参数不支持指定的值。
解决方法:在域控制器中加入sharepoint计算机,设置为administrators组中
- Vue关于echats的使用(浅显易懂)
安装 npm install echarts --save 引入 (全局) main.js import * as echarts from 'echarts'; Vue.prototype.$ech ...