代码检查:明确指定字符串比较
与 在字符串转换中显式指定文化类似,此检查有助于避免在具有不同文化设置的机器上运行代码时出现问题。
当由 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
最后修改日期: 2025年 9月 26日