11

.NET Framework 中使用字符串的最佳实践中,建议将StringComparisonOrdinalIgnoreCase用于不区分大小写的文件路径。(我们称之为声明 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.:(来源

4

1 回答 1

5

当您想在不区分大小写的情况下比较字符串是否相等时,大写和小写都不正确。在这两种变体中,都有一些字符会搞砸。

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

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

new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)

在将字符串添加到数据结构之前不要大写字符串。在任何代码审查中我都会失败。

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

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

于 2015-09-23T13:31:14.800 回答