использование параметра out в условном потоке и ошибке CA1002 fxcop - PullRequest
1 голос
/ 10 марта 2012

У меня есть код синтаксического анализа xml, где я анализирую несколько узлов и атрибутов из xml.Используя короткое замыкание, я могу избежать, если в моем коде, потому что я хочу продолжить обработку только в положительном случае.Но я получаю ошибку 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 ]

2 голосов
/ 10 марта 2012

Предполагая, что вы говорите о 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.
    }
}
1 голос
/ 10 марта 2012

Вы уверены, что это CA1002?Потому что это правило Do not expose generic lists в соответствии с Google.В любом случае, я знаю, что в FxCop есть правило, которое предупреждает об использовании параметров out (а также ref), поскольку они не считаются оптимальной практикой для ОО (предполагается, что вы должны вернуть объект, который представляет результат).1005 * Чтобы избавиться от предупреждения, вам нужно изменить метод TryGetAttributeValue, чтобы не использовать out параметров.

В качестве примечания: Microsoft явно нарушила это правило в различных TryGetи TryParse методы.Так что если FxCop так говорит, это не обязательно делает его плохим выбором.

1 голос
/ 10 марта 2012

Предполагая, что вы на самом деле говорите о CA1021, который лучше подходит под ваше описание: Это статья MSDN об этом нарушении. Вы можете изменить тип метода на что-то отличное от public или protected (internal?)

В противном случае:

Чтобы исправить нарушение этого правила, вызванное типом значения, метод возвращает объект в качестве возвращаемого значения. Если метод должен вернуть несколько значений, перепроектировать его, чтобы вернуть один экземпляр объект, который содержит значения.

Если вы не можете / не хотите изменить тип защиты или изменить код, чтобы просто вернуть строку, то вам придется игнорировать это правило fxcop . Что, не страшная вещь. Вы должны решить, какие правила кажутся уместными, а какие нет.

Ваш код должен быть чем-то вроде GetAttributeValue, и использовать проверку на ноль, если вы хотите избежать этого правила fxcop. Или вы можете создать специальный класс и использовать шаблон нулевого объекта , но это выглядит слишком излишним.

В конце концов, вы контролируете свой код, и не все правила предназначены для всех.

0 голосов
/ 20 ноября 2013

Если вы прочитаете всю статью, в конце вы увидите следующее:

Методы, реализующие шаблон Try, такие как Int32.TryParse, не вызывать это нарушение.

Таким образом, пока ваш метод возвращает bool и имеет имя типа TryGetSomething, вы не нарушаете правило, если используете параметр out.

...