8

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

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

当我运行 FxCop 时,它正确报告了违反CA1062: ValidateArgumentsOfPublicMethods,因为如果sourcenull第一个构造函数中,它会抛出一个NullReferenceExceptionon source.Name

有什么办法可以解决这个警告吗?

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

4

5 回答 5

10

像这样?

public MyClass(SomeOtherClass source) : this(source, source == null ? null : source.Name) { }
public MyClass(SomeOtherClass source, string name) { /* ... */ }
于 2009-06-29T18:11:51.353 回答
1

有合理的时间关闭 FxCop 警告,这很可能是一个,但您可以通过检查 null 并引发异常(或替换默认值)的三元表达式或调用 static检查 null 并引发适当异常的方法。

于 2009-06-29T18:15:00.210 回答
1

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

public MyClass(SomeOtherClass source) : this(source, source?.Name) { }
于 2019-08-03T12:01:54.530 回答
1

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

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

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

于 2019-10-14T09:50:58.023 回答
0

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

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

于 2009-06-29T18:10:38.360 回答