使用InvariantCultureIgnoreCase代替ToUpper进行不区分大小写的字符串比较。

15

这个页面上,一位评论者写道:

千万不要使用 .ToUpper 来确保比较字符串时不区分大小写。

请使用以下方法代替:

type.Name.ToUpper() == (controllerName.ToUpper() + "Controller".ToUpper())) 

这样做:

type.Name.Equals(controllerName + "Controller", 
     StringComparison.InvariantCultureIgnoreCase)

为什么这种方式更受欢迎?

2个回答

18

以下是详细的答案...土耳其语测试请阅读第3部分)

  

正如许多人所讨论的那样,在土耳其语中,“I”的行为与大多数语言不同。根据Unicode标准,当我们的小写“i”转变为大写时,它变成了“İ”(U+0130“带有点的拉丁大写字母I”)。类似地,我们的大写“I”在转变为小写时会变成“ı”(U+0131“无点拉丁小写字母i”)。

     

解决方案:除非您确实需要基于文化背景的语言比较(这将在土耳其给您带来带点的大写I),否则请使用序数(原始字节)比较器或不变的区域设置进行比较

而根据微软公司的说法,您甚至不应该使用不变的...而应该使用序数...(在Microsoft .NET 2.0中使用字符串的新建议


5
谢谢……我有点怀疑是这样的。当别人强调必须以某种方式做某事,但不解释原因时,让人感到很恼火。请帮我翻译这句话。 - Robert Harvey
1
我也注意到了使用大小写不敏感比转换为大/小写会带来一些性能上的提升,因此使用比较标志绝对是正确的方式... - Chris R. Donnelly
这很有趣,因为长时间以来,微软推荐使用 ToUpper 而不是 ToLower,原因就在于此。对我来说总是很难找到它,但它在 MSDN 网站上。...或者现在可能已经不是了。编辑:找到了!https://msdn.microsoft.com/en-us/library/bb386042.aspx。有人能解释一下吗? - Brent Rittenhouse

9
简而言之,它由CLR进行了优化(也占用更少的内存)。
此外,如果那微小的性能差异很重要,大写比较比ToLower()更优化。
针对您的示例,还有一种更快的方法: 点击这里
String.Equals(type.Name, controllerName + "Controller", 
              StringComparison.InvariantCultureIgnoreCase);

有没有考虑像umlauts这样的奇怪字符,或者其他类似的东西?所以这个人只是在独裁吗? - Robert Harvey
@Robert - 这里有一些附加好处,比如不用担心的免费null检查,但主要还是优化上的区别……字符串在CLR中得到了极高的优化,因此利用CLR内置的快捷方式可以显著提升性能,尤其是在频繁循环中执行该代码时。此外,它还可以减少内存开销。 - Nick Craver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接