CA1820: 文字列の長さを使用して空の文字列をテストします
TypeName |
TestForEmptyStringsUsingStringLength |
CheckId |
CA1820 |
分類 |
Microsoft.Performance |
互換性に影響する変更点 |
なし |
原因
文字列が、Object.Equals を使用して空の文字列と比較されています。
規則の説明
String.Length プロパティまたは String.IsNullOrEmpty メソッドを使用して文字列を比較する方法は、Equals を使用する場合よりもはるかに高速です。この理由として、Equals の方が、IsNullOrEmpty または Length プロパティ値を取得するときに実行される命令数よりも多くの MSIL 命令を実行されることと、ゼロと比較されることが挙げられます。
null 文字列の場合、Equals と Length == 0 の動作は異なることに注意してください。null 文字列について Length プロパティの値を取得しようとすると、共通言語ランタイムによって NullReferenceException がスローされます。null 文字列と空の文字列を比較すると、共通言語ランタイムによって例外はスローされません。この比較では false が返ります。null のテストは、これらの 2 つの手法の相対的なパフォーマンスに大きな影響を与えません。.NET Framework 2.0 が対象の場合、IsNullOrEmpty メソッドを使用します。それ以外の場合、できれば Length == の比較を使用します。
違反の修正方法
この規則違反を修正するには、比較に Length プロパティを使用するように変更し、null 文字列をテストします。.NET Framework 2.0 が対象の場合、IsNullOrEmpty メソッドを使用します。
警告を抑制する状況
パフォーマンスが問題ではない場合、この規則による警告を抑制しても安全です。
使用例
次の例では、空の文字列を検索するときに使用できる技法を紹介します。
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.");
}
}
}
}