【问题标题】:What is wrong with ToLowerInvariant()?ToLowerInvariant() 有什么问题?
【发布时间】:2010-05-10 09:15:56
【问题描述】:

我有以下代码行:

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

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

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

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

【问题讨论】:

  • 但是请注意,在这种特殊情况下,使用string.Equals(item.Name, "connectionstring", StringComparison.OrdinalIgnoreCase) 可能是最好的方法。

标签: c# .net .net-4.0


【解决方案1】:

谷歌给出了指向CA1308: Normalize strings to uppercase的提示

上面写着:

字符串应规范化为大写。一小部分字符在转换为小写时不能往返。往返意味着将字符从一种语言环境转换到另一种以不同方式表示字符数据的语言环境,然后从转换后的字符中准确地检索出原始字符。

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

以后我建议先用谷歌搜索 - 我会为我收到的所有 FxCop 警告这样做;)对阅读相应的文档有很大帮助;)

【讨论】:

  • +1 表示“对阅读相应的文档有很大帮助”(也表示绝对正确...)
  • 正确,一些波兰语字符不会使 ToLower() 往返。
  • @ChrisBallance & TomTom 您能否提供一个往返失败导致不良行为的示例?
  • “我建议先用谷歌搜索”的言论非常烦人且无用。这是第一个谷歌结果。
  • 我用谷歌搜索了它,我在这里得到了第一个结果
【解决方案2】:

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

正如 cmets 中所指出的,这确实是通过 C# 在 CLR 中说明的。 我不确定这是否真的是真的,因为在 MSDN 上没有关于这个主题的任何内容。 msdn 上的字符串比较指南提到 toupperinvariant 和 tolowerinvariant 是相等的,不喜欢前者。

【讨论】:

  • +1 真。实际上,我几天前就读到了这一点,并且对存在差异感到非常惊讶。但是,我认为差异应该很小。
  • 对此有任何参考吗?做了 .NET 10 年并且被认为非常好 - 我不知道 ;) 希望有一些参考。
  • 我想我通过 C# (J Richter) 在 CLR 中看到了这一点。不过还是更喜欢使用显式的 StringComparer。
猜你喜欢
  • 2013-09-10
  • 1970-01-01
  • 2021-06-09
  • 2014-08-12
  • 2010-12-23
  • 2010-10-24
  • 2011-10-04
  • 2011-10-08
相关资源
最近更新 更多