有什么区别,什么时候用什么?如果我总是使用ToLower()和ToLowerInvariant()的风险是什么?


String.ToLower()使用默认区域性,而String.ToLowerInvariant()使用不变区域性。所以你实际上是在问不变区域性和序数字符串比较之间的区别。


我认为这很有用:

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

hth


根据当前区域性的不同,ToLower可能会产生一个特定于区域性的小写字母,这不是您所期望的。例如,在i上生成没有点而不是info的hinfo,从而搞砸了字符串比较。因此,ToLowerInvariant应该用于任何非特定于语言的数据。当用户输入可能是他们的母语/字符集时,通常是使用ToLower的唯一时间。

请看这个问题的例子: c# - ToLower()有时会从字母“I”中删除点


TL; diana:

当处理“内容”(例如文章、帖子、评论、名字、地点等)时,使用ToLower()。当使用“字面量”(例如命令行参数,自定义语法,应该是enum的字符串等)时,使用ToLowerInvariant()。

例子:

=错误地使用ToLowerInvariant =

在土耳其语中,DIŞ的意思是“外面”,di的意思是“牙齿”。DIŞ的正确小写字母是dagh。所以,如果你不正确地使用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上面的点,几乎不可能看到)。这将是相当令人沮丧的土耳其用户。