【发布时间】:2020-04-02 20:26:28
【问题描述】:
我已经开始在 C# 8 中使用可为空的引用类型。到目前为止,除了一件小事之外,我很喜欢这种改进。
我正在迁移一个旧代码库,其中包含大量冗余或无法访问的代码,例如:
void Blah(SomeClass a) {
if (a == null) {
// this should be unreachable, since a is not nullable
}
}
很遗憾,我没有看到任何可以为我标记此代码的警告设置!这是微软的疏忽,还是我遗漏了什么?
我也使用 ReSharper,但它的警告设置似乎也没有捕捉到这一点。有没有其他人找到解决这个问题的方法?
编辑:我知道从技术上讲这仍然是可以实现的,因为可空性检查不是防弹的。这不是重点。在这种情况下,我将参数声明为不可为空,检查它是否为空通常是错误的。在极少数情况下 null 作为不可为 null 的类型传入,我更愿意查看 NullReferenceException 并追踪错误传入 null 的违规代码。
【问题讨论】:
-
引用类型的可空性是编译时检查,但仍然可以从没有启用可空引用类型的代码中传递空值,因此仍然可以访问执行分支。
-
@madreflection 我知道从技术上讲它仍然可以访问,但是 99% 的时间我不在乎,如果有人将 null 作为非可空参数。我希望我的代码假设 NonNull 参数不为空。
-
我不确定用于静态代码分析的 sonarlint 扩展是否已经实现了类似的规则,如果没有,将来可能会包含它(您也可以编写自己的验证规则)跨度>
-
这样的空检查在公共 API 中绝对有用,因为您不知道调用者是否遵守可空性注释。但是在私有层中,在许多情况下移除它们是合理的(某些情况下可能仍然更喜欢深度防御)。这不是 C# 编译器旨在帮助解决的问题,但对于分析器来说似乎是一项完美的任务。
-
@JulienCouvreur 我完全同意。就我而言,代码是私有的,所以我同时拥有调用者和被调用者。由于我将所有警告都视为错误,并且被调用者也在进行可空性分析,因此我有理由确定我可以删除“== null”检查。如果被调用者错误地发送了 null,那是被调用者必须修复的编程错误:我不介意因此引发 NullReferenceException。
标签: c# null c#-8.0 nullable-reference-types