ToLowerInvariant()有什么问题?

JL.*_*JL. 63 .net c# .net-4.0

我有以下代码行:

var connectionString = configItems.
                Find(item => item.Name.ToLowerInvariant() == "connectionstring");
Run Code Online (Sandbox Code Playgroud)

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

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

这意味着ToUpperInvariant()更可靠吗?

小智 98

Google给出了一个指向CA1308的提示:将字符串规范化为大写

它说:

字符串应规范化为大写.一小组字符在转换为小写字符时无法进行往返.进行往返意味着将字符从一个区域设置转换为另一个区域设置,以不同方式表示字符数据,然后从转换后的字符中准确地检索原始字符.

所以,是的 - ToUpper比ToLower更可靠.

在未来我建议首先使用谷歌搜索 - 我为所有那些FxCop警告我这样做我被抛出;)帮助了很多阅读相应的文档;)

  • +1"有助于阅读相应的文档"(也是绝对正确的......) (10认同)
  • @ChrisBallance&TomTom您能举例说明往返失败会导致意外行为吗? (10认同)
  • 我用谷歌搜索了一下,最后得到了第一个结果 (7认同)
  • “我建议先使用Google搜索”这句话很烦人,没用。这是谷歌的第一个结果。 (3认同)
  • 正确,某些波兰语字符不会进行 ToLower() 往返。 (2认同)

Hen*_*nri 21

除了TomTom所说的,.net还是针对大写的字符串比较进行了优化.所以使用上不变量理论上比下变量更快.

这在CLR中通过C#确实说明,如评论中所指出的那样.以下链接引用了本书的这一部分.我不确定这当然是否真的如此,因为MSDN上没有关于这个主题的内容.msdn上的字符串比较指南提到toupperinvariant和tolowerinvariant是相同的,不喜欢前者.

C#中的字符串比较

  • 我想我是通过C#(J Richter)在CLR中看到的.仍然喜欢使用显式的StringComparer. (2认同)