为什么 Resharper 建议将 "StringComparison.Ordinal" 添加到 String.IndexOf?

Why does Resharper recommend adding "StringComparison.Ordinal" to String.IndexOf?

在 "Common Practices and Code Improvements" 标题下,Resharper 对这一行说:

If dt(0)("ThemeWidth").ToString.IndexOf("%") > "0" Then
    headerPanel.Width = Unit.Percentage(dt(0)("ThemeWidth").ToString.Replace("%", ""))

"String.IndexOf(string) 是 culture-specific" 并鼓励我将其更改为:

If dt(0)("ThemeWidth").ToString.IndexOf("%", StringComparison.Ordinal) > "0" Then
    headerPanel.Width = Unit.Percentage(dt(0)("ThemeWidth").ToString.Replace("%", ""))

为什么?添加“StringComparison.Ordinal”对我有什么改进此代码的作用?

考虑以下示例:

Dim longText As String = "01234ss789ß"
Dim shortText As String = "ß"

Dim index1 As Integer = longText.IndexOf(shortText)
Dim index2 As Integer = longText.IndexOf(shortText, StringComparison.Ordinal)

天真地,您会期望 IndexOf 到 return 10,因为“ß”符号只出现在字符串的末尾。

但在某些文化中,ß 符号被视为两个 ss 的别名,因此不带附加参数的 IndexOf 在某些计算机上 return 为 5,在其他计算机上为 10。

当使用参数 StringComparison.Ordinal 时,所有文化差异都将被忽略,它会 return 10 在所有计算机上都是可预测的。