CA1062: ValidateArgumentsOfPublicMethods 对共同构造函数调用

Posted

技术标签:

【中文标题】CA1062: ValidateArgumentsOfPublicMethods 对共同构造函数调用【英文标题】:CA1062: ValidateArgumentsOfPublicMethods on co-constructor calls 【发布时间】:2009-06-29 18:08:24 【问题描述】:

我有一个有两个构造函数的类,如下所示:

public MyClass(SomeOtherClass source) : this(source, source.Name)  
public MyClass(SomeOtherClass source, string name)  /* ... */ 

当我运行 FxCop 时,它正确地报告了违反 CA1062: ValidateArgumentsOfPublicMethods,因为如果 source 在第一个构造函数中是 null,它将在 source.Name 上抛出一个 NullReferenceException

有没有办法解决这个警告?

我可以创建一个扩展方法来检查 null 并返回它的参数,但它会很难看。此外,据我了解,它不会解决警告,因为 FxCop 不会意识到它的作用。

【问题讨论】:

【参考方案1】:

像这样?

public MyClass(SomeOtherClass source) : this(source, source == null ? null : source.Name)  
public MyClass(SomeOtherClass source, string name)  /* ... */ 

【讨论】:

是的,就是这样。您也可以使用任何静态方法。 不幸的是,当单个参数构造函数使用其参数值的属性将值作为参数传递给具有许多参数的另一个构造函数(例如,将 javascript 样式的“参数对象”转换为标量参数)时,这相当笨拙。我希望 C# 允许 static-scoped 代码在超类的构造函数之前运行,以便可以应用复杂的验证逻辑。【参考方案2】:

有时可以关闭 FxCop 警告,这很可能是一次,但您可以通过检查 null 并引发异常(或替换默认值)的三元表达式或调用来纠正问题到一个检查 null 并抛出适当异常的静态方法。

【讨论】:

【参考方案3】:

由于前段时间有人问过这个问题,我只想注意 C# 中的后续功能,您现在也可以使用它:

public MyClass(SomeOtherClass source) : this(source, source?.Name)  

【讨论】:

【参考方案4】:

从 C# 7.0 开始,您也可以这样做:

public MyClass(SomeOtherClass source) : this(source?.Name ?? throw new ArgumentNullException(nameof(source)))  

C# 7.0 允许将异常作为表达式抛出。 (见Microsoft Docs)

【讨论】:

【参考方案5】:

我想说解决此警告的唯一方法是将其关闭。 FxCop 是一个很棒的工具,但有时您需要记住,它只是一个工具,可以提出并不总是适合您的代码的建议。

在这个例子中,如果你不想看到它,我会说忽略警告或禁用它。

【讨论】:

以上是关于CA1062: ValidateArgumentsOfPublicMethods 对共同构造函数调用的主要内容,如果未能解决你的问题,请参考以下文章

通过生成参数验证来修复 FxCop CA1062

VS代码分析CA1062即使在空检查后也会触发

如何验证 C# 中的 List 参数以修复 CA1062

代码合约 + 代码分析

错误代码:1062。重复条目 'PRIMARY'

#1062 - 键 'PRIMARY' 的重复条目 '19'