Code inspection: Specify string comparison explicitly
Last modified: 11 February 2024tip
Similarly to the Specify a culture in string conversion explicitly, this inspection helps to avoid problems with running your code on machines with different culture settings.
When string results returned by String.ToUpper()
/String.ToLower()
are compared using equality operators (==
/!=
), comparison results may differ depending on the machine's locale. The canonical example is the Turkish where there is a lowercase dotless "ı" with the corresponding uppercase "I", and a lowercase "i" with an uppercase "İ" with the dot.
So in a case of using String.ToUpper()
/String.ToLower()
for a case-insensitive comparison:
public void Foo(string a, string b)
{
if (a.ToUpper() != b.ToUpper()) { }
if (a.ToLower() != b.ToLower()) { }
}
Public Sub Foo(a As String, b As String)
If a.ToUpper() <> b.ToUpper() Then
End If
If a.ToLower() <> b.ToLower() Then
End If
End Sub
JetBrains Rider suggests replacing it with an overload of String.Equals()
:
if (!String.Equals(a, b, StringComparison.CurrentCultureIgnoreCase)) {}
If Not String.Equals(a, b, StringComparison.CurrentCultureIgnoreCase) Then
End If
where it is immediately clear that the strings are compared taking the culture settings into consideration.
If the comparison is explicitly made culture-insensitive, then it is also suggested to use String.Equals()
with the InvariantCultureIgnoreCase
in the comparison rule parameter, for example:
if (a.ToLowerInvariant() == b.ToLowerInvariant()) {}
If a.ToLowerInvariant() = b.ToLowerInvariant() Then
End If
could be replaced with
if (String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase)) {}
If [String].Equals(a, b, StringComparison.InvariantCultureIgnoreCase) Then
End If