Condividi tramite


CA1820: Testare le stringhe vuote utilizzando la lunghezza di stringa

TypeName

TestForEmptyStringsUsingStringLength

CheckId

CA1820

Category

Microsoft.Performance

Breaking Change

Non sostanziale

Causa

Una stringa viene confrontata con la stringa vuota mediante Object.Equals.

Descrizione della regola

Il confronto di stringhe mediante la proprietà String.Length o il metodo String.IsNullOrEmpty è notevolmente più veloce rispetto all'utilizzo di Equals. Equals infatti esegue un numero di istruzioni MSIL maggiore rispetto al metodo IsNullOrEmpty o al numero di istruzioni eseguite per recuperare il valore della proprietà Length e confrontarlo con zero.

Occorre tenere presente che Equals e Length == 0 presentano comportamenti diversi per le stringhe null. Se si tenta di ottenere il valore della proprietà Length su una stringa null, in Common Language Runtime viene generata un'eccezione System.NullReferenceException. Se si esegue un confronto tra una stringa null e la stringa vuota, in Common Language Runtime non viene generata un'eccezione e il confronto restituisce false. Il test per null non incide in modo significativo sulle prestazioni relative di questi due approcci. Quando la destinazione è .NET Framework 2.0, utilizzare il metodo IsNullOrEmpty. In caso contrario utilizzare il confronto Length == quando possibile.

Come correggere le violazioni

Per correggere una violazione di questa regola, modificare il confronto in modo che utilizzi la proprietà Length ed esegua il test per la stringa null. Se la destinazione è .NET Framework 2.0, utilizzare il metodo IsNullOrEmpty.

Esclusione di avvisi

L'esclusione di un avviso da questa regola è sicura se le prestazioni non sono importanti.

Esempio

Nell'esempio riportato di seguito vengono illustrate le diverse tecniche utilizzate per cercare una stringa vuota.

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