Cal*_*ins 10 c# c#-8.0 nullable-reference-types
鉴于使用C#8.0的可空引用类型功能的程序中的函数,我是否仍应对参数执行空检查?
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));
...
}
Run Code Online (Sandbox Code Playgroud)
这些代码都不是公共API的一部分,所以我怀疑这些检查可能是多余的.这两个参数未标记为可为空,因此编译器应警告任何调用代码是否可以传入null.
Jon*_*eet 13
鉴于使用C#8.0的可空引用类型功能的程序中的函数,我是否仍应对参数执行空检查?
这取决于您通过API的所有路径的确定程度.考虑以下代码:
public void Foo(string x)
{
FooImpl(x);
}
private void FooImpl(string x)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这FooImpl不是公共API的一部分,但如果Foo不验证其参数,仍然可以接收空引用.(实际上,它可能依赖于Foo执行参数验证.)
检查中FooImpl肯定不是多余的,它的执行在执行时检查,编译器不能是绝对有把握在编译时.可空的引用类型提高了一般安全性,更重要的是提高了代码的表现力,但它们与CLR提供的类型安全性不同(例如,阻止您将string引用视为Type参考).编译器有多种方式可以"错误"查看特定表达式在执行时是否为空的视图,并且!无论如何都可以覆盖编译器.
更广泛地说:如果您的检查在 C#8 之前没有冗余,那么它们在 C#8 之后就不是冗余的,因为可空的引用类型功能不会改变为代码生成的IL而不是属性.
因此,如果您的公共API正在执行所有适当的参数检查(Foo在上面的示例中),那么代码中的检查已经是多余的.你对此有多自信?如果你绝对自信并且错误的影响很小,那么肯定 - 摆脱验证.C#8功能可以帮助你对此有所信心,但你仍需要小心你不要太自信 - 毕竟 - 上面的代码不会给出任何警告.
我个人在更新Noda Time for C#8时没有删除任何参数验证.
| 归档时间: |
|
| 查看次数: |
591 次 |
| 最近记录: |