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 (一般的なリストを公開しないout) について話していると仮定すると、FxCop はメソッドのパラメーターについて不平を言っていますTryGetAttributeValue()

outそのメソッドをリファクタリングして、パラメーターに属性値を格納する代わりに属性値を返し、属性nullが存在しない場合に返すようにすることができます。そこから、null 合体演算子を使用??して同じ制御フローを維持できます。

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

あなたが実際にCA1021について話していると仮定すると、これはあなたの説明によりよく適合します:これはこの違反に関するMSDNの記事です。publicメソッドタイプをまたはprotectedinternal?)以外に変更できます

さもないと:

値型によって引き起こされるこのルールの違反を修正するには、メソッドにオブジェクトを戻り値として返すようにします。メソッドが複数の値を返す必要がある場合は、値を保持するオブジェクトの単一のインスタンスを返すようにメソッドを再設計します。

保護タイプを変更できない、または単に文字列を返すようにコードを変更できない場合は、このfxcopルールを無視する必要があります。これは、ひどいことではありません。どのルールが適切であると思われるか、どのルールが適切でないと思われるかを決定する必要があります。

コードはのようなものGetAttributeValueである必要があり、このfxcopルールを回避したい場合は、nullのチェックを使用します。または、特別なクラスを作成してNullオブジェクトパターンを使用することもできますが、それはやり過ぎのようです。

結局、あなたはあなたのコードを管理しているのであり、すべてのルールがすべての人を対象としているわけではありません。

于 2012-03-10T05:58:12.180 に答える
1

本当にCA1002ですか?それDo not expose generic listsがグーグルによるルールだからです。とにかく、FxCop には、OO のベスト プラクティスとは見なされない (結果を表すオブジェクトを返すことになっている) ため、パラメーターの使用out(および) について警告するルールがあることを知っています。ref

警告を取り除くには、パラメーターTryGetAttributeValueを使用しないようにメソッドを変更する必要がありoutます。

TryGet補足として: Microsoft は明らかに、さまざまな方法でこの規則に違反していTryParseます。したがって、FxCop がそう言っているからといって、必ずしもそれが悪い選択であるとは限りません。

于 2012-03-10T06:01:35.650 に答える
0

記事全体を読むと、最後に次のことがわかります。

Int32.TryParse などの Try パターンを実装するメソッドでは、この違反は発生しません。

したがって、メソッドが a を返し、 のboolような名前を持っている限りTryGetSomething、パラメーターを使用しても規則に違反していませんout

于 2013-11-20T15:44:40.030 に答える