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