5

次のFxCopエラーが発生します:

CA1820:Microsoft.Performance:「Program.Main()」の「string.operator ==(string、string)」の呼び出しを「String.IsNullOrEmpty」の呼び出しに置き換えます。

 static void Main()
    {
        string str = "abc";

        switch (str)
        {
            case "":
                Console.WriteLine("Hello");
                break;
        }

        Console.ReadLine();
    }
4

4 に答える 4

4

うーん、興味深い質問です。ILSpyで見ると、逆コンパイルされたコードは次のように表示されます。

string str = "abc";
string a;
if ((a = str) != null && a == "")
{
    Console.WriteLine("Hello");
}
Console.ReadLine();

ブロックに変換する理由はif-else、switchステートメントにcase句が含まれている場合、それ以外の場合はルックアップテーブルが使用されるためです(数はわかりません5が、これはに表示されているものです)。 ILSpy)5if - else5

今それは不平を言っていa == ""ます、そしてここにそれがそれについて不平を言っている理由の説明があります:

CA1820:文字列の長さを使用して空の文字列をテストします

String.LengthプロパティまたはString.IsNullOrEmptyメソッドを使用した文字列の比較は、Equalsを使用するよりも大幅に高速です。。これは、EqualsがIsNullOrEmptyまたはLengthプロパティ値を取得してゼロと比較するために実行された命令の数よりもはるかに多くのMSIL命令を実行するためです。EqualsとLength==0は、null文字列では動作が異なることに注意してください。null文字列のLengthプロパティの値を取得しようとすると、共通言語ランタイムはSystem.NullReferenceExceptionをスローします。ヌル文字列と空の文字列を比較する場合、共通言語ランタイムは例外をスローしません。比較はfalseを返します。nullのテストは、これら2つのアプローチの相対的なパフォーマンスに大きな影響を与えません。.NET Framework 2.0を対象とする場合は、IsNullOrEmptyメソッドを使用します。それ以外の場合は、可能な限り長さ==の比較を使用してください。

于 2013-01-30T07:29:25.570 に答える
1

このルールは、等式演算子()でチェックする代わりにLength、文字列のプロパティを使用するか、string.IsNullOrEmpty空の文字列をチェックするように強制しますstr == ""

 string str = "abc";

        switch (str.Length)
        {
            case 0:
                Console.WriteLine("Hello");
                break;
        }

        Console.ReadLine();

switchただし、ステートメントの前にIsNullOrEmptyを使用して文字列を確認するか、string.Empty大文字と小文字を区別することをお勧めしますdefault

if (string.IsNullOrEmpty(str))
{
    // related code section
}
else
{
    switch (str)
    {
        case "case1":
            Console.WriteLine("Hello");
            break;
        case "case2":
            Console.WriteLine("case2");
            break;
    }
}
于 2013-01-30T07:22:54.877 に答える
0

switchステートメントでこれを行うべきではありません。それは悪いプログラミングの習慣です。

単純なif条件を使用する必要があります。

string str = "abc";
if (string.IsNullOrEmpty(str))
    Console.WriteLine("Hello");
于 2013-01-30T07:26:32.247 に答える
-1

""の代わりにstring.emptyを使用する必要がありますが、それではおそらくfxcop警告は解決されません。通常はこれに注意しますが、この場合は、文字列を使用したスイッチ/ケースのパターンが本当に必要であると仮定すると、過度にアクティブに見えます。何らかの理由でそれを抑制できない場合(実際のswitchステートメントにはもっと多くのケースがあると仮定して)、ケースの前に特別なif(String.IsNullOrEmpty(str))...を書くことができます。

于 2013-01-30T07:23:50.993 に答える