次の方法で共有


CA1862: 'StringComparison' メソッドのオーバーロードを使用して大文字と小文字を区別しない文字列比較を実行する

プロパティ
ルール ID CA1862
Title 'StringComparison' メソッドのオーバーロードを使用して大文字と小文字を区別しない文字列比較を実行する
カテゴリ パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

コードは、最初に一方または両方の文字列で ToLower()ToLowerInvariant()ToUpper()、または ToUpperInvariant() を呼び出すことにより、大文字と小文字を区別せずに 2 つの文字列を比較します。

規則の説明

コードが ToLower()ToLowerInvariant()ToUpper()、または ToUpperInvariant() を呼び出すと、割り当てが実行されます。 これらのメソッドを呼び出す唯一の理由が、大文字と小文字を区別しない文字列比較または検索を実行することである場合、割り当ては不要です。 代わりに、StringComparison を受け取る文字列比較メソッドを呼び出し、*IgnoreCase 値の 1 つを指定できます。

違反の修正方法

ToLower()ToLowerInvariant()ToUpper()、または ToUpperInvariant() の呼び出しを削除し、StringComparer メソッドの 1 つ、または StringComparison 引数を取る次のメソッドのいずれかを呼び出します。

Note

  • StringComparison 引数を受け取るオーバーロードを使用するようにコードを変更すると、動作が微妙に変化する可能性があります。 この変更を行うか、Visual Studio の電球アイコンによる提案を受け入れる場合は、徹底的なテストを実施することが重要です。
  • 文字列を文化的に機密性の高い方法で比較する必要がない場合は、StringComparison.OrdinalIgnoreCase を渡すことを検討してください。

次の例に、1 つの規則違反を示します。

string s1 = "aBc";
string s2 = "aBC";

int _ = s1.ToUpper().CompareTo(s2.ToUpper());
Dim s1 As String = "aBc"
Dim s2 As String = "aBC"

Dim i As Integer = s1.ToUpper().CompareTo(s2.ToUpper())

次の例は、違反を修正するコードを示しています。

string s1 = "aBc";
string s2 = "aBC";

int _ = StringComparer.CurrentCultureIgnoreCase.Compare(s1, s2);
Dim s1 As String = "aBc"
Dim s2 As String = "aBC"

Dim i As Integer = StringComparer.CurrentCultureIgnoreCase.Compare(s1, s2)

どのようなときに警告を抑制するか

パフォーマンスが問題にならない場合は、この規則による警告を抑制しても問題ありません。

Entity Framework Core (EF Core) を使用している場合は、文字列を比較してデータベースに対してクエリを実行するシナリオでは、この規則を抑制する必要があります。 StringComparison 引数を受け取る String.Equals(String, StringComparison) などのメソッドを使用すると、EF Core により例外がスローされます。これは、このようなクエリを SQL に変換しないためです。 詳細については、「組み込みの .NET 文字列操作の変換」を参照してください。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA1862
// The code that's violating the rule is on this line.
#pragma warning restore CA1862

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA1862.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。