JetBrains Rider 2025.2 Help

值和可空性分析

JetBrains Rider 执行值分析,帮助您发现可能的 'null' 解引用以及冗余的布尔比较和空检查。

分析可空值的不同方法

JetBrains Rider 可以通过多种方式分析值:

  • 通过理解语言结构的行为。

    在下面的示例中,基于参数 obj 已明确检查了可空性的事实,JetBrains Rider 合理地推测 obj 的值确实可能为 'null',并显示相应的警告:

    JetBrains Rider:可空性分析
  • 通过依赖 code annotation attributes[CanBeNull][NotNull][ItemCanBeNull][ItemNotNull] ),当 Nullable reference types 被禁用时。

    在以下示例中,方法 条形图 被标记为 [CanBeNull] 属性,利用此信息,JetBrains Rider 会警告您 条形图 的返回值可能为 null,并且在其上调用方法可能导致 'null' 解引用:

    JetBrains Rider:可空性分析
  • 在 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 设置 的 编辑器 | 检查设置 页面上使用 可空引用类型的警告模式 选项。

当 JetBrains Rider 忽略可空 API 合约时,可空性分析依赖程序控制流来报告冗余的空检查。 例如:

var myString = ApiMethod(); if (myString is null) throw new ApplicationException("the string is null"); // warning 'Expression is always true' // 'myString' cannot be null because it's already checked for null in our code if (myString != null) Console.WriteLine(myString);

有关 NRT 及其在 JetBrains Rider 中的支持的更多信息,请观看此网络研讨会录制:

值分析的更多示例

以下是 JetBrains Rider 的值和可空性分析的更多示例:

  • 如果已经通过简单的 LINQ 查询进行了可空性检查,JetBrains Rider 会告诉您进一步的可空性检查是多余的:

    对集合项的冗余可空性检查
  • 如果您使用 [ItemNotNull] 属性标记集合,也会发生相同的情况:

    对集合项的冗余可空性检查
  • 下一个示例说明了当启用 悲观模式时,值分析的工作方式。 列表的值已检查了可空性,但列表项未检查。 因此,JetBrains Rider 在此警告可能存在对 'null' 的解引用操作。

    对集合项的冗余可空性检查
最后修改日期: 2025年 9月 26日