2016-12-01 109 views
0

在“共同做法和代码改进”专栏,ReSharper的说,关于这条线:为什么Resharper建议在String.IndexOf中添加“StringComparison.Ordinal”?

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

String.IndexOf(串)是特定文化”,并鼓励我把它改成这样:

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

为什么?添加“StringComparison.Ordinal”为我提高了这个代码吗?

+0

该机器人很可能只是从MSDN返回的东西,比如'使用StringComparison.Ordinal或StringComparison.OrdinalIgnoreCase进行比较,作为文化无关字符串匹配的安全默认值。请参见[在.NET Framework中使用字符串的最佳做法](https://msdn.microsoft.com/en-us/library/dd465121(v = vs.110).aspx)...或者不接受机器人订单 – Plutonix

+3

曾经说过的马克吐温吗?那些不能记得过去被谴责重复它。*?请参阅[当字符串保证不会更改时,字符串比较是否真的不同](http://stackoverflow.com/q/10941375/1070452) – Plutonix

+0

不,这是Santayana。 –

回答

2

请看下面的例子:

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

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

天真,你会期望IndexOf返回10,因为“SS”标志只出现在字符串的最末尾。

但是在一些文化中,ß符号被看作是两个ss的别名,因此没有附加参数的IndexOf将在某些计算机上返回5,在其他计算机上返回10。

当使用参数StringComparison.Ordinal时,所有的文化差异将被忽略,并且它将在所有计算机上返回10个可预测的值。