值和可空性分析
ReSharper 执行值分析,帮助您发现可能的 'null' 解引用以及冗余的布尔比较和空检查。
分析可空值的不同方式
ReSharper 可以通过多种方式分析值:
通过理解语言结构的行为。
在下面的示例中,基于参数
obj已明确检查了可空性这一事实,ReSharper 合理地假设obj的值确实可能为 'null',并显示相应的警告:
通过依赖 代码注解属性 ([CanBeNull]、 [NotNull]、 [ItemCanBeNull]、 [ItemNotNull] )当 可空引用类型 被禁用时。
在以下示例中,方法
Bar被标记为[CanBeNull]属性,利用此信息,ReSharper 警告您Bar的返回值可能为 null,并且在其上调用方法可能导致 'null' 解引用:
在 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 忽略可空 API 合约时,空值分析依赖程序控制流来报告冗余的空值检查。 例如:
有关 NRT 及 ReSharper 如何支持它们的更多信息,请观看此网络研讨会录制:
值分析的更多示例
以下是 ReSharper 值和可空性分析的更多示例:
如果已经通过简单的 LINQ 查询进行了可空性检查,ReSharper 会告诉您进一步的可空性检查是多余的:

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