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 é comparado com a seqüência de caracteres 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 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 valor e compará-lo a zero.

Você deve estar ciente que Equals e Length = = 0 se comportam de forma diferente para seqüências de caracteres nula. 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ê executar uma comparação entre uma seqüência nula e a seqüência de caracteres vazia, o common language runtime não lance uma exceção; a comparação retorna false. Teste de null não afeta significativamente o desempenho relativo dessas duas abordagens. Quando o direcionamento de .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, alterar a comparação para usar o Length propriedade e teste para a seqüência de caracteres nula. Se o direcionamento de .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 que são 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.");
         }
      }
   }
}