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