CA1820 : Vérifiez la présence de chaînes vides par la longueur de chaîne
TypeName |
TestForEmptyStringsUsingStringLength |
CheckId |
CA1820 |
Catégorie |
Microsoft.Performance |
Modification avec rupture |
Modification sans rupture |
Cause
Une chaîne est comparée à la chaîne vide à l'aide de Object.Equals.
Description de la règle
Comparer des chaînes au moyen de la propriété String.Length ou de la méthode String.IsNullOrEmpty est considérablement plus rapide qu'au moyen de Equals.En effet, Equals exécute un nombre d'instructions MSIL très supérieur à IsNullOrEmpty ou au nombre d'instructions exécutées pour récupérer la valeur de propriété Length et pour la comparer à zéro.
Vous devez comprendre que Equals et Length == 0 se comportent différemment pour les chaînes null.Si vous essayez d'obtenir la valeur de la propriété Length sur une chaîne null, le Common Language Runtime lève un System.NullReferenceException.Si vous effectuez une comparaison entre une chaîne null et la chaîne vide, le Common Language Runtime ne lève aucune exception ; la comparaison retourne la valeur false.Tester les valeurs null n'affecte pas considérablement les performances relatives de ces deux approches.Lorsque le .NET Framework 2.0 est ciblé, utilisez la méthode IsNullOrEmpty.Sinon, utilisez la comparaison Length == dès que possible.
Comment corriger les violations
Pour corriger une violation de cette règle, modifiez la comparaison pour utiliser la propriété Length et tester la chaîne null.Si le .NET Framework 2.0 est ciblé, utilisez la méthode IsNullOrEmpty.
Quand supprimer les avertissements
Il est possible de supprimer sans risque un avertissement de cette règle si les performances ne constituent pas un problème.
Exemple
L'exemple suivant illustre les différentes techniques utilisées pour rechercher une chaîne vide.
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.");
}
}
}
}