值和可空性分析
JetBrains Rider 执行值分析,帮助您发现可能的 'null' 解引用以及冗余的布尔比较和空检查。
分析可空值的不同方法
JetBrains Rider 可以通过多种方式分析值:
通过理解语言结构的行为。
在下面的示例中,基于参数
obj已明确检查了可空性的事实,JetBrains Rider 合理地推测obj的值确实可能为 'null',并显示相应的警告:
通过依赖 code annotation attributes ([CanBeNull]、 [NotNull]、 [ItemCanBeNull]、 [ItemNotNull] ),当 Nullable reference types 被禁用时。
在以下示例中,方法
条形图被标记为[CanBeNull]属性,利用此信息,JetBrains Rider 会警告您条形图的返回值可能为 null,并且在其上调用方法可能导致 'null' 解引用:
在 C# 8.0 及更高版本中,如果项目中启用了 Nullable reference types ,JetBrains Rider 可以重用编译器分析的结果。
相等性比较分析
JetBrains Rider 帮助您以以下方式分析相等运算符(== 和 != )的使用:
值和可空性分析模式
JetBrains Rider 可以以不同模式分析值:
- 乐观
默认情况下,值分析模式为乐观模式。 在此模式下,JetBrains Rider 仅在值已明确检查了可空性或符号被标记为
[CanBeNull]或[ItemCanBeNull]属性时,警告可能的 'null' 解引用。 上述示例中演示了乐观模式。- 悲观
在此模式下,JetBrains Rider 会在所有未明确检查值可空性的上下文中警告可能的 'null' 解引用,除非符号被标记为
[NotNull]或[ItemNotNull]属性。
要更改值分析模式或禁用分析,请在 JetBrains Rider 设置 的 页面上配置 值分析模式 首选项 Ctrl+Alt+S。
可空引用类型
如果启用了 可空引用类型(NRT) ,JetBrains Rider 将重用 C# 编译器分析的结果。
NRT 提高了可空性分析的整体精度,但在某些情况下,NRT 合约可能会被违反,例如,当值来自没有 #可为 null 上下文的代码时。 在这种情况下,您可能会收到可空性检查的误报警告(例如, 表达式始终为 'true' 或 'false')。 您可以选择忽略可空 API 合约,仅在代码中对值的先前操作保证其可以或不可以为 null 时报告问题。
您可以直接从 Alt+Enter 菜单更改此行为:

…或者在 JetBrains Rider 设置 的 页面上使用 可空引用类型的警告模式 选项。
当 JetBrains Rider 忽略可空 API 合约时,可空性分析依赖程序控制流来报告冗余的空检查。 例如:
有关 NRT 及其在 JetBrains Rider 中的支持的更多信息,请观看此网络研讨会录制:
值分析的更多示例
以下是 JetBrains Rider 的值和可空性分析的更多示例:
如果已经通过简单的 LINQ 查询进行了可空性检查,JetBrains Rider 会告诉您进一步的可空性检查是多余的:

如果您使用
[ItemNotNull]属性标记集合,也会发生相同的情况:
下一个示例说明了当启用 悲观模式时,值分析的工作方式。 列表的值已检查了可空性,但列表项未检查。 因此,JetBrains Rider 在此警告可能存在对 'null' 的解引用操作。
