4

少数の連結の代わりに StringBuilder を使用しないことはよく知られています。

string s = "Hello";
if (greetingWorld)
{
    s += " World";
}

s += "!";

ただし、かなりのサイズのループでは、StringBuilder が当然の選択です。

string s = "";
foreach (var i in Enumerable.Range(1,5000))
{
    s += i.ToString(); // <- bad idea!
}

Console.WriteLine(s);

生の C# ソースまたはコンパイル済みアセンブリのいずれかで実行して、ソース コード内で呼び出されている場所を特定できるツールはありますか? String.Concat(よくわからない場合は、IL 出力にs += "foo"マップされString.Concatます。) 明らかに、プロジェクト全体を現実的に検索し、すべてを評価+=して左辺値が文字列かどうかを識別することはできません。

理想的には、for/foreach ループ内の呼び出しのみを指摘しますが、すべて の注目の誤検知にも我慢しますString.Concat。また、使用するコードを自動的にリファクタリングするリファクタリング ツールがいくつかあることは承知していますが、現時点では使用法をStringBuilder特定することにのみ関心があります。Concat

私は自分のコードで Gendarme と FxCop を定期的に実行していますが、これらのツールはどちらも、私が説明した内容を識別しません。ただし、@Cristian が指摘したように、以前のバージョンの FxCop はこれをチェックしていました。古いバージョンの FxCop からそのルールだけを抽出し、新しいバージョン (1.36) にそれを使用するように指示する方法があるでしょうか?

4

2 に答える 2

3

おそらく、NDepend CQL (Code Query Language) はこれに十分な表現力を備えています。かどうかはわかりませんが。

于 2010-05-10T16:51:44.243 に答える
0

FxCop には、そのためのアドバイスがいくつかありました。この記事をチェック

たとえば、このコードの記事によると:

static string BadConcatenate(string[] items)
{
    string strRet = string.Empty;

    foreach(string item in items)
    {
        strRet += item;
    }

    return strRet;
}

FxCop レポート

"Change StringCompareTest.BadConcatenate(String[]):String to use StringBuilder 
  instead of String.Concat or +

編集

ルールCA1807は、ノイズが多いか、分析が適用されなくなったために削除されたようです。そして、コンパイラは自動的にそれを置き換えていないように見えます.同じリンクで、両方の方法のパフォーマンスについて詳しく説明しています.

于 2010-05-10T17:23:47.933 に答える