JetBrains Rider 2024.1 ヘルプ

コード検査: 文字列比較を明示的に指定する

このインスペクションは、文字列変換で明示的にカルチャを指定すると同様に、異なるカルチャ設定のマシンでコードを実行する際の問題を回避できます。

String.ToUpper()/String.ToLower() によって返された文字列結果が等価演算子 (==/!=) を使用して比較される場合、比較結果はマシンのロケールによって異なる場合があります。標準的な例はトルコ語で、ドットなしの小文字の「ı」と対応する大文字の「I」、および小文字の「i」とドット付きの大文字の「İ」があります。

大文字と小文字を区別しない比較に String.ToUpper()/String.ToLower() を使用する場合は、次のようになります。

public void Foo(string a, string b) { if (a.ToUpper() != b.ToUpper()) { } // or if (a.ToLower() != b.ToLower()) { } }
Public Sub Foo(a As String, b As String) If a.ToUpper() <> b.ToUpper() Then End If ' or If a.ToLower() <> b.ToLower() Then End If End Sub

JetBrains Rider は、String.Equals() のオーバーロードに置き換えることを提案しています。

if (!String.Equals(a, b, StringComparison.CurrentCultureIgnoreCase)) {}
If Not String.Equals(a, b, StringComparison.CurrentCultureIgnoreCase) Then End If

文化の設定を考慮して文字列が比較されることがすぐに分かります。

比較が明示的にカルチャに依存しない場合は、比較ルールパラメーターで String.Equals()InvariantCultureIgnoreCase を使用することもお勧めします。例:

if (a.ToLowerInvariant() == b.ToLowerInvariant()) {}
If a.ToLowerInvariant() = b.ToLowerInvariant() Then End If

と置き換えることができた

if (String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase)) {}
If [String].Equals(a, b, StringComparison.InvariantCultureIgnoreCase) Then End If