CA1820: Zbadaj pod kątem ciągów pustych przy użyciu długości ciągu
TypeName |
TestForEmptyStringsUsingStringLength |
CheckId |
CA1820 |
Kategoria |
Microsoft.Performance |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Ciąg jest porównywany do pustego ciągu za pomocą Object.Equals.
Opis reguły
Porównanie ciągów przy użyciu właściwości String.Length lub metody String.IsNullOrEmpty jest znacznie szybsze niż użycie Equals.Jest tak ponieważ Equals wykonuje znacznie więcej instrukcji MSIL niż IsNullOrEmpty lub liczby instrukcji wykonywanych by pobrać wartość właściwości Length i porównać ją do zera.
Należy pamiętać, że Equals i Length == 0 zachowują się odmiennie dla ciągów null.Podczas próby uzyskania wartości właściwości Length na pustym ciągu, środowisko uruchomieniowe języka wspólnego zgłasza NullReferenceException.Jeżeli wykonywane jest porównanie ciągu null i pustego ciągu, środowisko uruchomieniowe języka wspólnego nie zgłasza wyjątku; porównanie zwraca false.Testowanie na null nie wpływa znacząco na wydajność względną tych dwóch podejść.Podczas określania wartości docelowej Program .NET Framework 2,0, użyj metody IsNullOrEmpty.W przeciwnym razie użyj porównania Length ==, jeśli jest to możliwe.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, należy zmienić porównanie na właściwość Length i testować, czy występuje ciąg null.Jeśli określa się wartość docelową Program .NET Framework 2,0, należy użyć metody IsNullOrEmpty.
Kiedy pominąć ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli wydajności nie jest problemem.
Przykład
Poniższy przykład ilustruje różne techniki, które są używane do wyszukiwania pustych ciągów.
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.");
}
}
}
}