CA1820: Mithilfe der Zeichenfolgenlänge auf leere Zeichenfolgen prüfen
TypeName |
TestForEmptyStringsUsingStringLength |
CheckId |
CA1820 |
Kategorie |
Microsoft.Performance |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Eine Zeichenfolge wird unter Verwendung von Object.Equals mit der leeren Zeichenfolge verglichen.
Regelbeschreibung
Der Vergleich von Zeichenfolgen mit der String.Length-Eigenschaft oder der String.IsNullOrEmpty-Methode ist bedeutend schneller als ein Vergleich mit Equals. Der Grund dafür liegt darin, dass IsNullOrEmpty bedeutend mehr MSIL-Anweisungen ausführt als Length oder die Anweisungen, die ausgeführt werden, um den Wert der Equals-Eigenschaft abzurufen und mit 0 (null) zu vergleichen.
Sie sollten beachten, dass sich Equals und Length == 0 bei NULL-Zeichenfolgen anders verhalten. Wenn versucht wird, den Wert der Length-Eigenschaft für eine NULL-Zeichenfolge abzurufen, löst die Common Language Runtime einen System.NullReferenceException-Fehler aus. Wenn eine NULL-Zeichenfolge mit einer leeren Zeichenfolge verglichen wird, löst die Common Language Runtime keine Ausnahme aus. Der Vergleich ergibt false. Die Überprüfung auf NULL wirkt sich kaum auf die relative Leistung dieser zwei Ansätze aus. Wenn auf .NET Framework 2.0 abgezielt wird, verwenden Sie die IsNullOrEmpty-Methode. Andernfalls verwenden Sie den Length == Vergleich, wenn irgend möglich.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ändern Sie den Vergleich ab, sodass die Length-Eigenschaft verwendet wird und überprüft wird, ob eine NULL-Zeichenfolge vorliegt. Wenn auf .NET Framework 2.0 abgezielt wird, verwenden Sie die IsNullOrEmpty-Methode.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn die Leistung nicht von Belang ist.
Beispiel
Im folgenden Beispiel werden die verschiedenen Techniken veranschaulicht, die zur Suche nach einer leeren Zeichenfolge eingesetzt werden können.
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.");
}
}
}
}