コードインスペクション: 文字列比較を明示的に指定する
このインスペクションは、 文字列変換で明示的にカルチャを指定すると同様に、異なるカルチャ設定のマシンでコードを実行する際の問題を回避できます。
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
ReSharper は、これを String.Equals() のオーバーロードに置き換えることを提案しています:
if (!String.Equals(a, b, StringComparison.CurrentCultureIgnoreCase)) {}
If Not String.Equals(a, b, StringComparison.CurrentCultureIgnoreCase) Then
End If
文化の設定を考慮して文字列が比較されることがすぐに分かります。
比較が明示的にカルチャ非依存で行われている場合は、比較ルールのパラメーターに InvariantCultureIgnoreCase を指定した String.Equals() を使用することも推奨されます。例えば:
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
2026 年 6 月 12 日