避免由于 CA1062 而在子类中重复进行空验证
Avoid repeated null validation in subclass due to CA1062
常见的继承模式:
public abstract class Parent
{
public void Foo(string s)
{
_ = s ?? throw new ArgumentNullException(nameof(s)); //null guard
DoOtherStuff();
FooImpl(s); //forward to child class
}
protected virtual void FooImpl(string s);
}
public class Child : Parent
{
protected override void FooImpl(string s)
{
var l = s.Length; //CA1062
}
}
这给出 CA1062
:
In externally visible method, validate parameter 's' is non-null before using it.
它已经被验证为非空。
我可以使用 NRT 属性或技巧来避免重复验证吗?我可以使用 s!
,但我希望有更好的方法。
根据上面@CharlesMager 的评论,this 回购问题描述了潜在的问题。
总结是 CA1062
不是“NRT 感知”,因此使用 NRT 技巧无法避免此警告。
无法工作,因为被 CA1062 忽略了:
s!
作品:
- 抑制警告,例如通过
pragma
- 在childclass签名中使用
[NotNull]
- re-validate参数
- 接受它
常见的继承模式:
public abstract class Parent
{
public void Foo(string s)
{
_ = s ?? throw new ArgumentNullException(nameof(s)); //null guard
DoOtherStuff();
FooImpl(s); //forward to child class
}
protected virtual void FooImpl(string s);
}
public class Child : Parent
{
protected override void FooImpl(string s)
{
var l = s.Length; //CA1062
}
}
这给出 CA1062
:
In externally visible method, validate parameter 's' is non-null before using it.
它已经被验证为非空。
我可以使用 NRT 属性或技巧来避免重复验证吗?我可以使用 s!
,但我希望有更好的方法。
根据上面@CharlesMager 的评论,this 回购问题描述了潜在的问题。
总结是 CA1062
不是“NRT 感知”,因此使用 NRT 技巧无法避免此警告。
无法工作,因为被 CA1062 忽略了:
s!
作品:
- 抑制警告,例如通过
pragma
- 在childclass签名中使用
[NotNull]
- re-validate参数
- 接受它