ReSharper 2025.2 Help

值和可空性分析

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

分析可空值的不同方式

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

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

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

    ReSharper:可空性分析
  • 通过依赖 代码注解属性[CanBeNull][NotNull][ItemCanBeNull][ItemNotNull] )当 可空引用类型 被禁用时。

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

    ReSharper:可空性分析
  • 在 C# 8.0 及更高版本中,如果项目中启用了 可空引用类型 ,ReSharper 可以重用编译器分析的结果。

相等性比较分析

ReSharper 通过以下方式帮助您分析相等运算符(==!= )的使用:

值和可空性分析模式

ReSharper 可以以不同模式分析值:

乐观

默认情况下,值分析模式为乐观模式。 在此模式下,ReSharper 仅在值已明确检查了可空性,或符号被标记为 [CanBeNull][ItemCanBeNull] 属性时,警告可能的 'null' 解引用。 上述示例演示了乐观模式。

悲观

在此模式下,ReSharper 在所有未明确检查值可空性的上下文中警告可能的 'null' 解引用,除非符号被标记为 [NotNull][ItemNotNull] 属性。

要更改值分析模式或禁用分析,请在 ReSharper 选项 的 代码检查 | 设置 页面上配置 值分析模式 首选项 Alt+R, O

可空引用类型

如果启用了 可空引用类型(NRT) ,ReSharper 会重用 C# 编译器分析的结果。

NRT 提高了空值分析的整体精确性,但在某些情况下,NRT 合约可能会被违反,例如,当值来自没有 #nullable 上下文的代码时。 在这些情况下,您可能会收到可空性检查的误报警告(例如, 表达式始终为 'true' 或 'false')。 您可以选择忽略可空 API 合约,仅在代码中对值的先前操作保证其可以或不可以为空时报告问题。

您可以直接从 Alt+Enter 菜单更改此行为:

ReSharper:可空引用类型

...或者使用 可空引用类型的警告模式 选项,在 ReSharper 选项 的 代码检查 | 设置 页面上更改。

当 ReSharper 忽略可空 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 及 ReSharper 如何支持它们的更多信息,请观看此网络研讨会录制:

值分析的更多示例

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

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

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

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

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