CA1820: Comprobar si las cadenas están vacías mediante la longitud de cadena
Nombre de tipo |
TestForEmptyStringsUsingStringLength |
Identificador de comprobación |
CA1820 |
Categoría |
Microsoft.Performance |
Cambio problemático |
Poco problemático |
Motivo
Una cadena se compara con la cadena vacía utilizando Object.Equals.
Descripción de la regla
La comparación de cadenas utilizando la propiedad String.Length o el método String.IsNullOrEmpty es significativamente más rápida que si se utilizara Equals.Esto es porque Equals ejecuta de forma significativa más instrucciones de MSIL que IsNullOrEmpty o el número de instrucciones ejecutado para recuperar el valor de propiedad Length y compararlo con cero.
Debería ser consciente de que Equals y Length == 0 se comportan de manera diferente para las cadenas nulas.Si intenta obtener el valor de la propiedad Length en una cadena nula, el Common Language Runtime produce una System.NullReferenceException.Si realiza una comparación entre una cadena vacía y una nula, el Common Language Runtime no produce una excepción, sino que la comparación devuelve false.La comprobación de cadenas nulas no afecta significativamente al rendimiento relativo de estos dos enfoques.Cuando el destino es .NET Framework 2.0, utilice el método IsNullOrEmpty.De lo contrario, utilice la comparación Length == siempre que sea posible.
Cómo corregir infracciones
Para corregir una infracción de esta regla, modifique la comparación para utilizar la propiedad Length y comprobar la cadena nula.Si el destino es .NET Framework 2.0, utilice el método IsNullOrEmpty.
Cuándo suprimir advertencias
Es seguro suprimir una advertencia de esta regla si el rendimiento no supone un problema.
Ejemplo
En el ejemplo siguiente se muestran las diferentes técnicas que se utilizan para buscar una cadena vacía.
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.");
}
}
}
}