Share via


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

プロパティ
ルール ID CA1820
Title 文字列の長さを使用して空の文字列をテストします
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 いいえ

原因

文字列が Object.Equals を使用して空の文字列と比較されています。

規則の説明

String.Length プロパティまたは String.IsNullOrEmpty メソッドを使用して文字列と比較すると、Equals を使用するよりも処理速度が向上します。 これは、いずれかの命令またはプロパティ値を取得して 0 と比較するために実行された命令の数よりもIsNullOrEmpty大幅に多くの CIL 命令をLength実行するためEqualsです。

null 文字列の場合、Equals<string>.Length == 0 の動作は異なります。 null 文字列で Length プロパティの値を取得しようとすると、共通言語ランタイムが System.NullReferenceException をスローします。 null 文字列と空の文字列の比較を実行した場合、共通言語ランタイムは例外をスローせず、false を返します。 null 値のテストは、これらの 2 つのアプローチに関係するパフォーマンスに大きな影響を与えません。 .NET Framework 2.0 以降を対象とする場合は、IsNullOrEmpty メソッドを使用します。 それ以外の場合は、可能な限り Length == 0 の比較を使用します。

違反の修正方法

この規則違反を修正するには、IsNullOrEmpty メソッドを使用するように比較を変更します。

どのようなときに警告を抑制するか

パフォーマンスが問題にならない場合は、この規則による警告を抑制しても問題ありません。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA1820
// The code that's violating the rule is on this line.
#pragma warning restore CA1820

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA1820.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。

次の例は、空の文字列を検索するために使用されるさまざまな手法を示しています。

public class StringTester
{
    string s1 = "test";

    public void EqualsTest()
    {
        // Violates rule: TestForEmptyStringsUsingStringLength.
        if (s1 == "")
        {
            Console.WriteLine("s1 equals empty string.");
        }
    }

    // Use for .NET Framework 1.0 and 1.1.
    public void LengthTest()
    {
        // Satisfies rule: TestForEmptyStringsUsingStringLength.
        if (s1 != null && s1.Length == 0)
        {
            Console.WriteLine("s1.Length == 0.");
        }
    }

    // Use for .NET Framework 2.0.
    public void NullOrEmptyTest()
    {
        // Satisfies rule: TestForEmptyStringsUsingStringLength.
        if (!String.IsNullOrEmpty(s1))
        {
            Console.WriteLine("s1 != null and s1.Length != 0.");
        }
    }
}