我有一个包含两个构造函数的类,如下所示:
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不会意识到它的作用。
答案 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是一个很棒的工具,但有时您需要记住它只是一个工具,并且可以提出并不总是适合您的代码的建议。
在这个例子中,我会说忽略警告或者如果你不想看到它就禁用它。