gpt4 book ai didi

c# - 何时对启用可为空引用类型的参数进行空值检查

转载 作者:行者123 更新时间:2023-12-02 06:40:07 25 4
gpt4 key购买 nike

给定程序中使用 C# 8.0 可为 null 的引用类型功能的函数,我是否仍然应该对参数执行 null 检查?

void Foo(string s, object o)
{
if (s == null) throw new ArgumentNullException(nameof(s)); // Do I need these?
if (o == null) throw new ArgumentNullException(nameof(o));
...
}

所有代码都不属于公共(public) API,因此我怀疑这些检查可能是多余的。这两个参数未标记为可为空,因此编译器应警告是否有任何调用代码可能传入 null。

最佳答案

Given a function in a program using C# 8.0's nullable reference types feature, should I still be performing null checks on the arguments?

这取决于您对 API 的所有路径的确定程度。考虑这段代码:

public void Foo(string x)
{
FooImpl(x);
}

private void FooImpl(string x)
{
...
}

此处 FooImpl 不是公共(public) API 的一部分,但如果 Foo 未验证其参数,仍然可以接收空引用。 (事实上​​,它可能依赖 Foo 来执行参数验证。)

检查 FooImpl 当然不是冗余,因为它在执行时执行检查,而编译器在编译时无法绝对确定。可空引用类型提高了总体安全性,更重要的是提高了代码的表达能力,但它们与 CLR 提供的类型安全不同(为了阻止您将 string 引用视为 Type 引用,例如)。对于特定表达式在执行时是否为 null 的看法,编译器可能会通过多种方式出现“错误”,并且编译器无论如何都可以被 ! 覆盖。

更广泛地说:如果您的检查在 C# 8 之前 不是多余的,那么在 C# 8之后 也不是多余的,因为可空引用类型功能不会改变为代码生成的 IL,除了属性之外。

因此,如果您的公共(public) API 正在执行所有适当的参数检查(上例中的 Foo),那么代码中的检查已经是多余的。你对此有多少信心?如果你绝对有信心,并且错误的影响很小,那么当然可以——摆脱验证。 C# 8 功能可能会帮助您对此充满信心,但您仍然需要小心,不要过于自信 - 毕竟 - 上面的代码不会给出任何警告。

就我个人而言,在更新 C# 8 的 Noda Time 时,我不会删除任何参数验证。

关于c# - 何时对启用可为空引用类型的参数进行空值检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54526652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com