C# 项目的 nullable 检查
.Net6 生成的项目, 默认会启用 nullable 检查, 这样会大大避免 NullReferenceException 异常,
csproj 文件设置,
<PropertyGroup><TargetFramework>net6.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings></PropertyGroup>
Nullable 的取值有 enable/disable/warnings/annotations 4种, 4种类型涉及两个维度, 警告上下文和注解上下文的开启,
enable: 意义很明确, 启用最严格的方式, .net 6 默认方式. 即编译器对表达式推断和声明不符合, 将会报编译错误.
disable: 老项目默认方式, 即编译器不对nullable做任何推断, 也不会有任何警告.
warnings: 即关闭注解上下文, 仅仅开启警告上下文, 简单理解: 编译器不对引用类型变量做推断, 仅对值类型做简单推断, 违反nullable规则, 仅仅报 warning.
annotations: 编译器对引用类型变量自行推断, 但不做警告.
实际项目的问题:
问题1: 我们能确定赋值不会为null, 但编译器推断为空, 怎么调教编译器呢?
方案: 在代码中加上下面的方法即可.
ArgumentNullException.ThrowIfNull(keyValuePairs);
问题2: [DisallowNull] 注解和 T 的区别, [AllowNull] 和 T? 和Nullable<T> 的区别:
[DisallowNull] string a1="a" ; string a2="a";
上面代码在C#8是没有区别的, [DisallowNull] 常用于泛型类定义.
[AllowNull] string a1="a" ; string? a2="a"; Nullable<string> a3="a";
上面代码在C#8是没有区别的, [AllowNull] 常用于泛型类定义.
问题3: 强制干预编译器赋null值
string a = null; // warning
string b = null!; // ok
string c = default!; // ok
问题4: 如何为老项目启用nullable检查
csproj文件中, 启用nullable检查,
然后先为每个cs文件加上下面的指令
#nullable disable
然后一个一个文件开启, 并修正代码.
=================================
参考
=================================
C# 8: Nullable Reference Types - Meziantou's blog
C# 8.0 如何在项目中开启可空引用类型的支持 - walterlv
可为空引用类型 | Microsoft Docs
C# 项目的 nullable 检查相关推荐
- [笔记]解决m2eclipse给项目添加maven依赖管理时可能不给项目的build path...
为什么80%的码农都做不了架构师?>>> 解决办法:在m2eclipse提供的菜单里关闭项目的Maven依赖管理,然后再启动Maven的依赖管理!!! 检查:1)查看项目的.c ...
- 比尔盖茨是这样审查项目的 1
比尔盖茨是这样审查项目的 1 --选自<软件随想录:程序员部落酋长Joel谈软件> 2006 年 6 月 16 日 ,星期五 早先, Excel[1] 有一种没有名字的很蹩脚的编程语言. ...
- 限定项目的 Node.js 版本
限定项目的 Node.js 版本 限定项目运行所需的 Node.js 版本可保证项目在一个稳定可预期的环境中运行,减少不必要的故障.甚至有些依赖库只能工作于某些版本下.同时,不加以限制的话,在多人合作 ...
- python pytest_Python项目的pytest初始化
Python项目的pytest初始化 2018-01-19 00:08:25 +08 字数:2310 标签: Python Test 为什么要写测试 ¶ Python是一种必须要写测试的语言. 和C/ ...
- 参与 Apache 顶级开源项目的 N 种方式,Apache Dubbo Samples SIG 成立!
头图来源:https://opensource.guide/ 来源 | 阿里巴巴云原生公众号 只有贡献代码才算是参与开源项目社区贡献吗? 一说到参与开源项目贡献,一般大家的反应都是代码级别的贡献, ...
- 参与Apache顶级开源项目的N种方式,Apache Dubbo Samples SIG 成立!
简介:一说到参与开源项目贡献,一般大家的反应都是代码级别的贡献,总觉得我的代码被社区合并了,我才算一个贡献者,这是一个常见的错误认知.其实,在一个开源社区中有非常多的角色是 non-code cont ...
- Web高效管理多个项目的SVN仓库
转至:https://www.jianshu.com/p/a0af00642585 采用方案 Linux+Apache+Subversion+MySQL+JDK+Tomcat+Svnadmin 目录 ...
- 这是可用于下一个项目的React Native工具列表
by Rajput Mehul 通过拉杰普特·梅胡尔(Rajput Mehul) 这是可用于下一个项目的React Native工具列表 (Here's a list of React Native ...
- Android项目的targetSDK=23,在低于Android6.0的部分测试机(类似华为)上运行时出现的系统权限问题...
相信大家对Android6.0以上的动态权限已经有所了解,很多童鞋也已经跃跃欲试地将自己项目的targetSDK升级到了23及其以上,很不幸的是我也成为了其中一员,然而我还是图样图森破了,升级之后的问 ...
最新文章
- linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析
- IDEA是否会嫌导jar包麻烦吗???赶快来学习maven吧,冲冲冲
- 3、HTML <a>标签(超链接)
- html5 打印api,HTML5的API(一)
- SDH与PDH的区别介绍
- Python多线程编程基础1:为什么要使用线程
- matlab 遗传算法 等式约束,关于MATLAB遗传算法工具箱不等式约束
- 2.同步(Synchronization)
- 云视频会议对初创公司的益处
- MATLAB二次规划和整数规划
- 同步助手 android 微信 表情包,微信表情轻松导,同步助手带你装逼带你飞
- c语言入门教程--1编译器
- 前端学习-----HTML
- UCSC_2bit基因组格式ToFASTA格式
- 将自己的数据制作成cityscape格式
- AOE网络-关键路径
- cf596B. Wilbur and Array
- 采购申请屏幕以及BAPI增强
- js数组遍历所有元素方法 总结
- php中网页生成图片的方式,类似长微博图片生成器