Compartilhar via


CA1820: Testar usando o comprimento da seqüência de cadeias de caracteres vazias

TypeName

TestForEmptyStringsUsingStringLength

CheckId

CA1820

<strong>Categoria</strong>

Microsoft.Performance

Alteração significativa

Não-separável

Causa

Uma seqüência de caracteres é comparada com uma seqüência vazia, usando Object.Equals.

Descrição da regra

Comparação de seqüências de caracteres usando o String.Length propriedade ou o String.IsNullOrEmpty método é significativamente mais rápido do que usar Equals.Isso ocorre porque Equals executa significativamente mais instruções de MSIL que ambos IsNullOrEmpty ou o número de instruções executadas para recuperar o Length propriedade de valor e compará-lo a zero.

Você deve estar ciente que Equals e Length = = 0 se comportam de forma diferente para cadeias de caracteres nulas.Se você tentar obter o valor da Length o common language runtime de propriedade em uma seqüência nula, lança um System.NullReferenceException.Se você realizar uma comparação entre uma seqüência nula e uma seqüência vazia, o common language runtime não não lança uma exceção; a comparação retorna false.Teste de Null não afeta significativamente o desempenho relativo dessas duas abordagens.Se o destino for .NET Framework 2.0, use o IsNullOrEmpty método.Caso contrário, use o Length = = comparação sempre que possível.

Como corrigir violações

Para corrigir uma violação desta regra, altere a comparação para usar o Length propriedade e teste para a seqüência de caracteres nula.Se o destino for .NET Framework 2.0, use o IsNullOrEmpty método.

Quando suprimir avisos

É seguro eliminar um aviso esta regra se o desempenho não é um problema.

Exemplo

O exemplo a seguir ilustra as diferentes técnicas usadas para procurar uma seqüência vazia.

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