11

文字列には次の拡張メソッドがあります。

public static bool IsNullOrEmpty(this string target)
{
    return string.IsNullOrEmpty(target);
}

...そしてコードでは、次のように使用します。

public static string DoSomethingOnString(this string target)
{
    if (target.IsNullOrEmpty())
        return target;

    target = target.Trim();  //This line causes CA1062 violation

    return target;
}

これでコード分析を実行すると、ルールCA1062の違反が発生します。しかし、コードを次のように変更すると:

public static string DoSomethingOnString(this string target)
{
    if (string.IsNullOrEmpty(target))  //CHANGED LINE
        return target;

    target = target.Trim();  //This line DOES NOT cause CA1062 violation anymore

    return target;
}

……それならいい。

最初の例で null 条件をチェックしていないと思うのはなぜですか? string.IsNullOrEmpty または string.IsNullOrWhiteSpace のみをチェックしますか? CA に拡張メソッドを認識させる方法はありますか? または、このルールを抑制する必要がありますか?

更新: 同じ問題がある場合は、私が MS Connect に送信したフィードバック項目に投票できます: コード分析ルール CA1062 が誤った警告を発する

4

2 に答える 2

18

最初の例で null 条件をチェックしていないと思うのはなぜですか?

簡単に言うと、FxCop は、IsNullOrEmpty拡張メソッドがstring.IsNullOrEmpty. targetif is nullIsNullOrEmptyが返さtrueれ、メソッドが終了することを認識していません。基本的に、それには の知識が組み込まれているのではないかと思いstring.IsNullOrEmptyます。Code Contractsの深い推論と比較して、FxCop はコードの動作に対して比較的浅いチェックしか実行しないと私は信じているため、Code Contracts はここで成功する可能性が高くなります。FxCop に何が起こっているかを知らせるために、IsNullOrEmptyメソッドを で装飾することができます。ValidatedNotNullAttribute

public static bool IsNullOrEmpty([ValidatedNotNullAttribute] this string target)
{
    return string.IsNullOrEmpty(target);
}
//The naming is important to inform FxCop
sealed class ValidatedNotNullAttribute : Attribute { }

これは、コード分析が熱心すぎて批判できない場合がある例にすぎません。これは、私が使用したほぼすべてのコード分析ツールで見られるものです。あなたの選択は、通常、次のようなものです。

  • 以前は問題がなかった場合でも、コード分析ツールを回避するようにコードを変更します
  • 各サイトを手動でチェックした後、特定のサイトでルールを抑制します
  • 誤検知が頻繁に発生する場合は、ルール全体を抑制します
  • コード分​​析ツールを完全に放棄する

もちろん、バグや機能のリクエストも記録する必要があります...

于 2013-03-03T17:47:58.270 に答える