CA1820: Testare le stringhe vuote utilizzando la lunghezza di stringa
TypeName |
TestForEmptyStringsUsingStringLength |
CheckId |
CA1820 |
Category |
Microsoft.Performance |
Breaking Change |
Non sostanziale |
Causa
Una stringa viene confrontata con la stringa vuota mediante Object.Equals.
Descrizione della regola
Il confronto di stringhe mediante la proprietà String.Length o il metodo String.IsNullOrEmpty è notevolmente più veloce rispetto all'utilizzo di Equals. Equals infatti esegue un numero di istruzioni MSIL maggiore rispetto al metodo IsNullOrEmpty o al numero di istruzioni eseguite per recuperare il valore della proprietà Length e confrontarlo con zero.
Occorre tenere presente che Equals e Length == 0 presentano comportamenti diversi per le stringhe null. Se si tenta di ottenere il valore della proprietà Length su una stringa null, in Common Language Runtime viene generata un'eccezione System.NullReferenceException. Se si esegue un confronto tra una stringa null e la stringa vuota, in Common Language Runtime non viene generata un'eccezione e il confronto restituisce false. Il test per null non incide in modo significativo sulle prestazioni relative di questi due approcci. Quando la destinazione è .NET Framework 2.0, utilizzare il metodo IsNullOrEmpty. In caso contrario utilizzare il confronto Length == quando possibile.
Come correggere le violazioni
Per correggere una violazione di questa regola, modificare il confronto in modo che utilizzi la proprietà Length ed esegua il test per la stringa null. Se la destinazione è .NET Framework 2.0, utilizzare il metodo IsNullOrEmpty.
Esclusione di avvisi
L'esclusione di un avviso da questa regola è sicura se le prestazioni non sono importanti.
Esempio
Nell'esempio riportato di seguito vengono illustrate le diverse tecniche utilizzate per cercare una stringa vuota.
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.");
}
}
}
}