ToLowerInvariant()有什么问题?


77

我有以下代码行:

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

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

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

这是ToUpperInvariant()不是更可靠?


33
但是请注意,string.Equals(item.Name, "connectionstring", StringComparison.OrdinalIgnoreCase)在这种特定情况下,使用可能是最好的方法。
格雷格·比奇

Answers:


114

Google给出了指向CA1308的提示:将字符串标准化为大写

它说:

字符串应规范化为大写。一小部分字符转换为小写字母后就无法往返。往返意味着将字符从一个语言环境转换为另一种表示字符数据的语言环境,然后从转换后的字符中准确检索原始字符。

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

将来,我建议先使用Google谷歌搜索-对于所有我抛出的FxCop警告,我都应该这样做;)帮助阅读相关文档有很多帮助;)


13
+1代表“对阅读相关文档有很大帮助”(并且绝对正确...)
gehho 2010年

正确,某些波兰语字符不能使ToLower()往返。
克里斯·巴伦斯

14
@ChrisBallance和TomTom您能否提供一个示例,其中往返失败会导致不良行为?
Ohad Schneider 2014年

25
“我建议先使用Google搜索”这句话很烦人,没用。这是谷歌的第一个结果。
巴托斯

7
我用Google做了,结果到这里来了第一结果
Arina

23

除了TomTom所说的,.net还针对大写字符串比较进行了优化。因此,理论上使用上不变式要快于下不变式。

正如注释中指出的那样,这确实在CLR中通过C#声明。以下链接引用了本书的这一部分。我不确定这是否真的正确,因为在MSDN上找不到关于此主题的任何内容。msdn上的字符串比较指南提到toupperinvariant和tolowerinvariant相等,并且不喜欢前者。

C#中的字符串比较


+1正确。我实际上是几天前读到的,对两者之间的差异感到惊讶。但是,我认为差异应该很小。
gehho 2010年

有什么参考吗?从事.NET已有10年,并且被qconsidered很好-我还不知道;)很想获得一些参考。
TomTom 2010年

2
我想我是通过C#(J Richter)在CLR中看到的。虽然还是喜欢使用显式的StringComparer。
菲尔·甘

1
该链接似乎已消失。
SonerGönül18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.