条件流中 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)
{
}

条件流中 out 参数的用法和 CA1002 fxcop 错误

假设您谈论的是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在各种TryGetTryParse方法中显然违反了这一规则。因此,仅仅因为FxCop这么说,并不一定是一个糟糕的选择。

假设您实际上是在谈论 CA1021,它更适合您的描述: 这是有关此冲突的 MSDN 文章。您可以将方法类型更改为 publicprotected 以外的其他类型(internal

否则:

若要修复由值类型导致的与此规则的冲突,请 该方法返回对象作为其返回值。如果该方法必须 返回多个值,重新设计它以返回 保存值的对象。

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

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

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

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

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

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