为什么 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 在所有计算机上都是可预测的。
在 "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 在所有计算机上都是可预测的。