CA1062:关于共同构造函数调用的ValidateArgumentsOfPublicMethods

时间:2009-06-29 18:08:25

标签: c# .net constructor fxcop ca1062

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

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

当我运行FxCop时,它会正确报告违反CA1062: ValidateArgumentsOfPublicMethods的行为,因为如果source在第一个构造函数中为null,则会在{NullReferenceException上发出source.Name 1}}。

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

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

5 个答案:

答案 0 :(得分:10)

喜欢这个吗?

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

由于这个问题是在不久前提出的,我只想在C#的后续功能中加以注意,您现在也可以使用此功能:

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

答案 3 :(得分:1)

从C#7.0开始,您还可以执行以下操作:

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

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

答案 4 :(得分:0)

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

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