string.ToLower()和string.ToLowerInvariant()

时间:2011-06-03 10:20:25

标签: c# .net string

有什么区别以及何时使用什么?如果我总是使用ToLower()会有什么风险?如果我总是使用ToLowerInvariant()会有什么风险?

4 个答案:

答案 0 :(得分:117)

根据当前的文化,ToLower可能会生成您不期望的特定于文化的小写字母。例如,在i上没有点而不是ınfo生成info,从而破坏了字符串比较。因此,ToLowerInvariant应该用于任何非语言特定的数据。如果您的用户输入可能是其母语/字符集,则通常是您使用ToLower的唯一时间。

有关此问题的示例,请参阅此问题: C#- ToLower() is sometimes removing dot from the letter "I"

答案 1 :(得分:43)

我认为这很有用:

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

答案 2 :(得分:27)

String.ToLower()使用默认文化,而String.ToLowerInvariant()使用不变文化。所以你基本上是在问the differences between invariant culture and ordinal string comparision

答案 3 :(得分:11)

TL; DR:

使用&#34;内容&#34; (例如文章,帖子,评论,姓名,地点等)使用ToLower()。使用&#34;文字&#34; (例如命令行参数,自定义语法,应该是枚举的字符串等)使用ToLowerInvariant()

<强>示例:

= 错误地使用ToLowerInvariant =

在土耳其语中,DIŞ表示&#34;外面&#34; diş表示&#34;牙齿&#34;。 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上方的点,几乎不可能看到)。这对您的土耳其用户来说非常令人沮丧。