2010-05-10 51 views
50

我有下面的代码行:ToLowerInvariant()有什么问题?

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

VS 2010的代码分析告诉我下面的:

警告7 CA1308:Microsoft.Globalization:在方法...更换调用'string.ToLowerInvariant()'与String.ToUpperInvariant()。

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

+28

但是请注意,使用'string.Equals(item.Name “的ConnectionString”,StringComparison.OrdinalIgnoreCase)'可能是在这种特殊情况下,最好的办法。 – 2010-05-10 09:21:02

+0

http://stackoverflow.com/questions/773703/normalization-of-strings-with-string-toupperinvariant – kenny 2012-12-01 22:22:34

回答

86

谷歌给出指向CA1308: Normalize strings to uppercase

它说一个提示:

字符串应该被归为大写。一小部分人物在转换为小写字母时不能往返。进行往返意味着将字符从一种语言环境转换为另一种不同的表示字符数据的语言环境,然后从转换的字符中准确检索原始字符。

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

在未来,我建议首先谷歌搜索 - 我做的所有这些FxCop的警告我避开抛出;)有很大帮助读取相应的文件;)

+10

+1“帮助阅读相应的文档”(也是绝对正确的......) – gehho 2010-05-10 09:47:04

+0

正确的,一些波兰人不会进行ToLower()往返。 – 2013-08-30 13:53:49

+36

谷歌搜索引导我回到这个问题。 – richardtallent 2013-10-15 22:34:46

19

再说什么TomTom公司说,.NET是优化字符串比较大写。所以使用上部不变量在理论上比下部不变量更快。

这确实在CLR中通过C#声明,如评论中指出的那样。 以下链接引用本书的部分内容。我不确定这是否真的如此,因为在MSDN上没有关于此主题的信息。 msdn上的字符串比较指南提到toupperinvariant和tolowerinvariant是平等的,并不喜欢前者。

String comparisons in C#

+0

+1 true。我实际上在几天前阅读过这些内容,对于这种差异感到非常惊讶。不过,我认为差异应该很小。 – gehho 2010-05-10 09:46:16

+0

对此有何参考?做.NET 10年并被认为非常好 - 我不知道这一点;)愿意有一些参考。 – TomTom 2010-05-10 09:52:13

+2

我想我通过C#(J Richter)在CLR中看到了这一点。尽管如此,仍然更喜欢使用显式的StringComparer。 – 2010-05-10 10:03:27