Answers:
根据当前的文化,ToLower可能会生成您所期望的文化特定的小写字母。例如,ınfo
在i上生成点而不是点info
,从而破坏了字符串比较。因此,应在任何非语言特定的数据上使用ToLowerInvariant。当用户输入的输入可能使用其母语/字符集时,通常是唯一使用ToLower的时间。
有关此问题的示例,请参见此问题: C#-ToLower()有时会从字母“ I”中删除点
我认为这可能很有用:
http://msdn.microsoft.com/zh-CN/library/system.string.tolowerinvariant.aspx
更新
如果您的应用程序依赖于以可预测的方式更改字符串的情况(不受当前区域性的影响),请使用ToLowerInvariant方法。ToLowerInvariant方法等效于ToLower(CultureInfo.InvariantCulture)。当字符串集合必须以可预测的顺序出现在用户界面控件中时,建议使用此方法。
也
...在大多数地方,ToLower与ToLowerInvariant非常相似。这些文件表明,这些方法只会改变土耳其文化的行为。同样,在Windows系统上,文件系统不区分大小写,这进一步限制了它的使用...
http://www.dotnetperls.com/tolowerinvariant-toupperinvariant
hth
String.ToLower()
使用默认区域性,而String.ToLowerInvariant()
使用不变区域性。因此,您实质上是在询问不变文化和序数字符串比较之间的区别。
ToLower
变体无关。序数与不变式只是更改两个字符串的“排序顺序”,而不会更改相等性比较。
TL; DR:
当使用“内容”(例如文章,帖子,评论,名称,地点等)时,请使用ToLower()
。使用“文字”(例如,命令行参数,自定义语法,应为枚举的字符串等)时,请使用ToLowerInvariant()
。
例子:
= 使用ToLowerInvariant
不正确 =
在土耳其语中,DIŞ
意思是“外面”,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上方的圆点,几乎看不到)。对于您的土耳其用户而言,这将是非常令人沮丧的。