In 在 .NET Framework 中使用字符串的最佳实践 https://msdn.microsoft.com/en-us/library/dd465121(v=vs.110).aspx, 字符串比较OrdinalIgnoreCase https://msdn.microsoft.com/en-us/library/system.stringcomparison(v=vs.110).aspx建议用于不区分大小写的文件路径。 (我们称之为语句 A。)
我同意这一点,因为我可以在同一目录中创建两个文件:
é.txt
é.txt
它们的文件名不相同,第二个由e
和修饰符,所以它实际上有两个字母。 (您可以尝试使用复制粘贴。)
如果存在有效的不变区域性比较(而不是序数比较),NTFS 将不允许这些文件,因为在同一篇文章中他们解释说,在不变区域性中a + ̊ = å
但在文章中String.ToUpperInvariant() https://msdn.microsoft.com/en-us/library/system.string.toupperinvariant(v=vs.110).aspx有不同的建议:(陈述B.)
如果需要操作系统标识符的小写或大写版本,例如文件名、命名管道或注册表项,请使用 ToLowerInvariant 或 ToUpperInvariant 方法。
我需要创建文件路径集合(实际上HashSet
) 来检测重复项。因此,如果我在创建地图时遵守语句 B,我可能会以误报结束,因为上述文件名é.txt
and é.txt
将被视为一。我是否正确理解 MSDN 中的陈述 B 具有误导性?或者我错过了什么?
我即将构建一个库,最好从一开始就没有已知的错误,所以我只是不想忽视这一点。
Update:
语句 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 http://blogs.msdn.com/b/bclteam/archive/2005/06/01/424012.aspx#comments)