CA1820: Testujte prázdné řetězce pomocí délky řetězce

Vlastnost Hodnota
ID pravidla CA1820
Název Testujte prázdné řetězce pomocí délky řetězce
Kategorie Výkon
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Řetězec se porovná s prázdným řetězcem pomocí .Object.Equals

Popis pravidla

Porovnání řetězců pomocí String.Length vlastnosti nebo String.IsNullOrEmpty metody je rychlejší než použití Equals. Důvodem je to, že Equals provádí výrazně více instrukcí CIL než buď IsNullOrEmpty nebo počet pokynů provedených k načtení Length hodnoty vlastnosti a porovnání s nulou.

U řetězců Equals s hodnotou null se <string>.Length == 0 chovají odlišně. Pokud se pokusíte získat hodnotu Length vlastnosti v řetězci null, modul CLR vyvolá výjimku System.NullReferenceException. Pokud provedete porovnání mezi řetězcem null a prázdným řetězcem, modul CLR (Common Language Runtime) nevyvolá výjimku a vrátí false. Testování hodnoty null nemá významný vliv na relativní výkon těchto dvou přístupů. Při cílení na rozhraní .NET Framework 2.0 nebo novější použijte metodu IsNullOrEmpty . V opačném případě použijte Length porovnání == 0, kdykoli je to možné.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, změňte porovnání tak, aby používal metodu IsNullOrEmpty .

Kdy potlačit upozornění

Pokud není problém s výkonem, je bezpečné potlačit upozornění z tohoto pravidla.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklad

Následující příklad ukazuje různé techniky, které se používají k vyhledání prázdného řetězce.

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.");
        }
    }
}