ToUpperInvariant() – MSDN 的建议有误吗?
ToUpperInvariant() – is MSDN wrong on its recommendation?
In Best Practices for Using Strings in the .NET Framework, StringComparison OrdinalIgnoreCase
建议用于不区分大小写的文件路径。 (我们称之为声明 A。)
我同意这一点,因为我可以在同一目录中创建两个文件:
é.txt
é.txt
他们的文件名不一样,第二个是由e
和修饰符组成的,所以它实际上有两个字母。 (您可以自己尝试使用复制粘贴。)
如果存在不变文化比较(而不是顺序比较),NTFS 将不允许这些文件,因为他们在同一篇文章中解释说,在不变文化中 a + ̊ = å
但在 String.ToUpperInvariant()
上的文章中有不同的建议:(陈述 B.)
If you need the lowercase or uppercase version of an operating system identifier, such as a file name, named pipe, or registry key, use the ToLowerInvariant or ToUpperInvariant methods.
我需要创建文件路径集合(实际上 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)
当您想不区分大小写地比较字符串的相等性时,大写和小写都不正确。在这两种变体中,都有一些字符搞砸了。
不区分大小写地比较字符串的正确方法是使用不区分大小写的 StringComparison
选项之一(你知道的)。
不区分大小写地使用数据结构的正确方法是使用 StringComparer.*IgnoreCase
之一。例如:
new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)
在将大写字符串添加到数据结构之前,不要。在任何代码审查中我都会失败。
If you need the lowercase or uppercase version of an operating system identifier
你不需要这样的东西。此声明不适用于您的情况。
In Best Practices for Using Strings in the .NET Framework, StringComparison OrdinalIgnoreCase
建议用于不区分大小写的文件路径。 (我们称之为声明 A。)
我同意这一点,因为我可以在同一目录中创建两个文件:
é.txt
é.txt
他们的文件名不一样,第二个是由e
和修饰符组成的,所以它实际上有两个字母。 (您可以自己尝试使用复制粘贴。)
如果存在不变文化比较(而不是顺序比较),NTFS 将不允许这些文件,因为他们在同一篇文章中解释说,在不变文化中 a + ̊ = å
但在 String.ToUpperInvariant()
上的文章中有不同的建议:(陈述 B.)
If you need the lowercase or uppercase version of an operating system identifier, such as a file name, named pipe, or registry key, use the ToLowerInvariant or ToUpperInvariant methods.
我需要创建文件路径集合(实际上 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)
当您想不区分大小写地比较字符串的相等性时,大写和小写都不正确。在这两种变体中,都有一些字符搞砸了。
不区分大小写地比较字符串的正确方法是使用不区分大小写的 StringComparison
选项之一(你知道的)。
不区分大小写地使用数据结构的正确方法是使用 StringComparer.*IgnoreCase
之一。例如:
new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)
在将大写字符串添加到数据结构之前,不要。在任何代码审查中我都会失败。
If you need the lowercase or uppercase version of an operating system identifier
你不需要这样的东西。此声明不适用于您的情况。