ToUpperInvariant() - MSDN推荐错误了吗?

时间:2015-09-23 13:04:26

标签: .net string msdn toupper

Best Practices for Using Strings in the .NET Framework中,建议StringComparison OrdinalIgnoreCase用于不区分大小写的文件路径。 (我们称之为陈述A.)

我同意这一点,因为我可以在同一目录中创建两个文件:

é.txt
é.txt

他们的文件名不一样,第二个是由e和修饰符组成的,所以它实际上有两个字母。 (您可以尝试使用复制粘贴。)

如果存在不变文化比较(而不是序数比较),NTFS将不允许这些文件,因为在同一篇文章中他们解释说,在不变文化中a + ̊ = å

但在String.ToUpperInvariant()的文章中,有不同的建议:(陈述B。)

  

如果需要操作系统标识符的小写或大写版本(例如文件名,命名管道或注册表项),请使用ToLowerInvariant或ToUpperInvariant方法。

我需要创建文件路径集合(实际上是HashSet)来检测重复项。因此,如果我在创建地图时遵守陈述B,我可能会以误报结束,因为上述文件名é.txté.txt将被视为一个。我是否正确理解MSDN中的语句B具有误导性?或者我错过了什么?

我即将建立一个图书馆,最好从一开始就没有已知的错误,所以我根本不想忽视这一点。

更新:

语句B似乎还有一个问题:ToLowerInvariant()无法实际使用。原因(我引用最佳做法文章):DO: Use ToUpperInvariant rather than ToLowerInvariant when normalizing strings for comparison.实际原因:There is a small range of characters that do not roundtrip, and going to lowercase will make these characters unavailable.source

1 个答案:

答案 0 :(得分:5)

如果要比较字符串以区分不区分大小写,则大写和小写都不正确。在这两种变体中都有一些字符搞砸了。

比较不区分大小写的字符串的正确方法是使用一个不敏感的StringComparison选项(你知道)。

使用不区分大小写的数据结构的正确方法是使用StringComparer.*IgnoreCase之一。例如:

new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)

在将大写字符串添加到数据结构之前,请执行此操作。在任何代码审查中我都会失败。

  

如果您需要操作系统标识符的小写或大写版本

你不需要这样的东西。本声明不适用于您的情况。