ToLowerInvariant()有什么问题?

92

我有以下代码行:

var connectionString = configItems.
                Find(item => item.Name.ToLowerInvariant() == "connectionstring");

VS 2010代码分析告诉我以下内容:

  

警告7 CA1308:Microsoft.Globalization:在方法...中替换对“string.ToLowerInvariant()”的调用为String.ToUpperInvariant()。

这是否意味着ToUpperInvariant()更可靠?


35
然而,请注意在这种情况下使用 string.Equals(item.Name, "connectionstring", StringComparison.OrdinalIgnoreCase) 可能是最佳方法。 - Greg Beech
https://dev59.com/PHRA5IYBdhLWcg3w8ikl - kenny
3个回答

125

谷歌给出的提示指向CA1308: 将字符串规范化为大写

它说:

字符串应被规范化为大写。 当一个小组字符被转换为小写时,不能做一个循环旅行。 做一个循环旅行意味着将字符从表示字符数据不同的一种语言环境转换为另一种语言环境,然后准确地从转换后的字符中检索原始字符。

所以是的- ToUpper比ToLower更可靠。

在未来我建议先搜索一下 - 我对所有那些我被扔进来的FxCop警告都这么做 ;) 阅读相应的文档会有很大帮助 ;)


13
+1 表示同意“阅读相关文档对帮助很大”(同时也表示非常正确)。 - gehho
2
正确,一些波兰字符无法通过ToLower()方法进行往返转换。 - Chris Ballance
15
你能否提供一个例子,说明往返失败会导致不良行为? - Ohad Schneider
42
“我建议先谷歌搜索”这样的话真是又恼人又没用。这是第一个谷歌搜索结果。 - Bartosz
9
我已经谷歌搜索过了,最终在第一个结果中发现了这里。 - Arina
显示剩余3条评论

26

除了TomTom所说的,.net在字符串比较方面是针对大写字母进行优化的。因此,使用大写不变量理论上比使用小写不变量更快。

正如评论中指出的那样,CLR via C#确实提到了这一点。但我不确定这是否当然真实,因为MSDN上没有关于此主题的任何信息。MSDN上的字符串比较指南提到toupperinvariant和tolowerinvariant是相等的,不偏向前者。


+1 确实如此。我几天前就读到过这个,当时感到非常惊讶有这种差别。但是,我认为这种差别应该很小。 - gehho
有任何参考资料吗?我做.NET已经10年了,被认为非常优秀 - 我不知道这一点 ;) 希望能够提供一些参考。 - TomTom
2
我想我在CLR via C# (J Richter)中看到过这个。不过我仍然更喜欢使用显式的StringComparer。 - Phil Gan

2

如果您的代码需要执行ToLowerInvariant()操作,那么这并没有什么问题。当然,它不应该用于字符串比较,但这并不总是它的作用。我不喜欢在非比较场景中实施此规则(CA1308)的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接