Udostępnij za pośrednictwem


CA1820: Zbadaj pod kątem ciągów pustych przy użyciu długości ciągu

TypeName

TestForEmptyStringsUsingStringLength

CheckId

CA1820

Kategoria

Microsoft.Performance

Zmiana kluczowa

Niekluczowa

Przyczyna

Ciąg jest porównywany do pustego ciągu za pomocą Object.Equals.

Opis reguły

Porównanie ciągów przy użyciu właściwości String.Length lub metody String.IsNullOrEmpty jest znacznie szybsze niż użycie Equals.Jest tak ponieważ Equals wykonuje znacznie więcej instrukcji MSIL niż IsNullOrEmpty lub liczby instrukcji wykonywanych by pobrać wartość właściwości Length i porównać ją do zera.

Należy pamiętać, że Equals i Length == 0 zachowują się odmiennie dla ciągów null.Podczas próby uzyskania wartości właściwości Length na pustym ciągu, środowisko uruchomieniowe języka wspólnego zgłasza NullReferenceException.Jeżeli wykonywane jest porównanie ciągu null i pustego ciągu, środowisko uruchomieniowe języka wspólnego nie zgłasza wyjątku; porównanie zwraca false.Testowanie na null nie wpływa znacząco na wydajność względną tych dwóch podejść.Podczas określania wartości docelowej Program .NET Framework 2,0, użyj metody IsNullOrEmpty.W przeciwnym razie użyj porównania Length ==, jeśli jest to możliwe.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy zmienić porównanie na właściwość Length i testować, czy występuje ciąg null.Jeśli określa się wartość docelową Program .NET Framework 2,0, należy użyć metody IsNullOrEmpty.

Kiedy pominąć ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli wydajności nie jest problemem.

Przykład

Poniższy przykład ilustruje różne techniki, które są używane do wyszukiwania pustych ciągów.

using System;

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