条件流中 out 参数的用法和 CA1002 fxcop 错误
本文关键字:CA1002 fxcop 错误 用法 out 参数 条件 | 更新日期: 2023-09-27 18:27:23
我有一个xml解析代码,我正在解析xml中的多个节点和属性。使用短路,我能够在代码中避免 if,因为我想只在积极的情况下继续处理。但是我收到参数作为输出用法的 fxcop 错误CA1002
。
如何删除 fxcorp 错误?
public bool parseNode()
{
bool success = false;
string val1;
string val2;
string val3
success = TryGetAttributeValue(attribName1, out val1) &&
TryGetAttributeValue(attribName2, out val2) &&
TryGetAttributeValyue(attribName3, out val3);
if(success)
{
// do work
}
}
public bool TryGetAttributeValue(string attribName, out string value)
{
}
假设您谈论的是CA1021(避免输出参数(而不是CA1002(不公开泛型列表(,FxCop正在抱怨TryGetAttributeValue()
方法的out
参数。
您可以重构该方法,使其返回属性值,而不是将其存储在 out
参数中,并让它在属性不存在时返回null
。从那里,您可以使用空合并运算符??
来保持相同的控制流:
public string TryGetAttributeValue(string attribName)
{
// Return attribute value, or null.
}
public bool ParseNode()
{
if ((TryGetAttributeValue(attribName1)
?? TryGetAttributeValue(attribName2)
?? TryGetAttributeValue(attribName3)) != null) {
// Do work.
}
}
你确定是CA1002吗?因为根据谷歌的说法,这是Do not expose generic lists
规则。无论如何,我知道 FxCop 有规则警告使用out
(以及ref
(参数,因为它们不被认为是 OO 的最佳实践(您应该返回一个表示结果的对象(。
为了摆脱警告,您需要更改方法TryGetAttributeValue
不使用out
参数。
作为旁注:Microsoft在各种TryGet
和TryParse
方法中显然违反了这一规则。因此,仅仅因为FxCop这么说,并不一定是一个糟糕的选择。
假设您实际上是在谈论 CA1021,它更适合您的描述: 这是有关此冲突的 MSDN 文章。您可以将方法类型更改为 public
或 protected
以外的其他类型(internal
?
否则:
若要修复由值类型导致的与此规则的冲突,请 该方法返回对象作为其返回值。如果该方法必须 返回多个值,重新设计它以返回 保存值的对象。
如果您不能/不愿意更改保护类型或更改代码以仅返回字符串,那么您将不得不忽略此 fxcop 规则 . 这,不是一件可怕的事情。您必须决定哪些规则看起来相关,哪些不相关。
您的代码必须类似于 GetAttributeValue
,如果您想避免此 fxcop 规则,请使用 null 检查。或者,您可以创建一个特殊的类并使用 Null 对象模式,但这似乎太过分了。
最后,您可以控制您的代码,并非所有规则都适合所有人。
如果你阅读了整篇文章,你可以在最后看到以下内容:
实现 Try 模式的方法,例如 Int32.TryParse,不要引发此冲突。
因此,只要您的方法返回一个bool
并且具有类似于 TryGetSomething
的名称,如果您使用 out
参数,您就不会违反规则。