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