1

我有一个 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)
{
}
4

4 回答 4

2

假设您在谈论CA1021避免输出参数)而不是CA1002不要公开通用列表),FxCop 正在抱怨您的方法的out参数。TryGetAttributeValue()

您可以重构该方法,使其返回属性值而不是将其存储在out参数中,并null在属性不存在时返回。从那里,您可以使用null-coalescing运算符??来保持相同的控制流:

public string TryGetAttributeValue(string attribName)
{
    // Return attribute value, or null.
}

public bool ParseNode()
{
    if ((TryGetAttributeValue(attribName1)
        ?? TryGetAttributeValue(attribName2)
        ?? TryGetAttributeValue(attribName3)) != null) {
        // Do work.
    }
}
于 2012-03-10T06:02:26.587 回答
1

你确定是CA1002?因为那是Do not expose generic lists根据谷歌的规则。无论如何,我知道 FxCop 有规则警告使用out(和ref)参数,因为它们不被认为是 OO 的最佳实践(你应该返回一个代表结果的对象)。

为了摆脱警告,您需要将方法更改TryGetAttributeValue为不使用out参数。

附带说明:微软显然在各种方法TryGet上都违反了这条规则。TryParse因此,仅仅因为 FxCop 这么说,它并不一定是一个糟糕的选择。

于 2012-03-10T06:01:35.650 回答
1

假设您实际上是在谈论 CA1021,它更符合您的描述:这是有关此违规的 MSDN 文章。您可以将方法类型更改为publicor protected( internal?)

否则:

要修复由值类型导致的违反此规则的情况,请让该方法将对象作为其返回值返回。如果该方法必须返回多个值,请重新设计它以返回包含这些值的对象的单个实例。

如果您不能/不愿意更改保护类型或更改代码以简单地返回字符串,那么您将不得不忽略此 fxcop 规则。哪个,不是什么可怕的事情。你必须决定哪些规则看起来相关,哪些不相关。

您的代码必须类似于GetAttributeValue,如果您想避免此 fxcop 规则,请使用 null 检查。或者,您可以创建一个特殊的类并使用Null 对象模式,但这似乎太过分了。

最后,您可以控制自己的代码,并非所有规则都适用于所有人。

于 2012-03-10T05:58:12.180 回答
0

如果您阅读整篇文章,您可以在最后看到以下内容:

实现 Try 模式的方法(例如 Int32.TryParse)不会引发此冲突。

因此,只要您的方法返回 abool并具有类似的名称TryGetSomething,如果您使用该out参数,就不会违反规则。

于 2013-11-20T15:44:40.030 回答