ToLower()
和何时使用ToLowerInvariant()
会有什么风险?根据当前的文化环境,ToLower 可能会产生一些文化特定的小写字母,这可能会导致你出乎意料的结果,例如生成没有点的 "ı" 而不是 "i",从而破坏字符串比较。因此,在任何非语言特定数据的情况下,都应该使用 ToLowerInvariant。只有在你可能有用户输入并且他们的本地语言/字符集可能不同时,才需要使用 ToLower。
参见这个问题以了解此问题的示例:C#- ToLower() is sometimes removing dot from the letter "I"
TL;DR:
当处理“内容”(如文章、帖子、评论、名称、地点等)时,请使用ToLower()
。当处理“文字”(如命令行参数、自定义语法、应该是枚举的字符串等)时,请使用ToLowerInvariant()
。
示例:
=不正确地使用 ToLowerInvariant
=
在土耳其语中,“DIŞ”表示“外面”,而“diş”表示“牙齿”。正确的小写形式为“dış”。因此,如果您不正确地使用ToLowerInvariant
,则可能会在土耳其出现拼写错误。
=不正确地使用 ToLower
=
现在假设你正在编写一个SQL解析器。你将有类似下面的代码:
if(operator.ToLower() == "like")
{
// Handle an SQL LIKE operator
}
当你更改语言环境时,SQL语法不会发生变化。 法国人不会写SÉLECTIONNEZ x DE books
而非SELECT X FROM books
。但是,为了使上述代码起作用,土耳其人需要写SELECT x FROM books WHERE Author LİKE '%Adams%'
(注意大写字母i上面的点,几乎看不见)。 这可能会让你的土耳其用户感到非常沮丧。
我认为这可能很有用:
http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx
更新
如果您的应用程序依赖于字符串大小写以一种受当前区域设置影响不大且可以预测的方式更改,请使用 ToLowerInvariant 方法。 ToLowerInvariant 方法等同于 ToLower(CultureInfo.InvariantCulture)。当一组字符串必须以可预测的顺序出现在用户界面控件中时,推荐使用该方法。
还有
...ToLower 在大多数情况下与 ToLowerInvariant 非常相似。文档表明,这些方法仅在土耳其文化方面会改变行为。此外,在 Windows 系统上,文件系统不区分大小写,这进一步限制了其使用...
http://www.dotnetperls.com/tolowerinvariant-toupperinvariant
希望对您有所帮助
String.ToLower()
使用默认文化,而 String.ToLowerInvariant()
使用不变文化。因此,您实际上是在询问 不变文化和序号字符串比较之间的区别。
ToLower
变体时,这种区别并不相关;Ordinal vs. invariant 只会改变两个字符串的“排序顺序”,而不会改变相等比较。 - ToolmakerSteve