【发布时间】:2020-08-27 14:29:21
【问题描述】:
根据我的理解(见my other question),为了决定是否使用序数或文化规则来测试字符串相等性,必须考虑执行比较的语义。
如果必须将两个比较字符串视为原始字符序列(换句话说,两个符号),则必须执行序号字符串比较。在服务器端代码中执行的大多数字符串比较都是这种情况。
示例:按用户名执行用户查找。在这种情况下,可用用户的用户名和搜索到的用户名只是符号,它们不是特定语言的单词,因此在比较它们时无需考虑语言因素。 在这种情况下,由不同字符组成的两个符号必须被认为是不同的,无论任何语言规则如何。
如果必须将两个比较字符串视为特定语言中的单词,则在比较过程中必须考虑文化规则。根据该语言的语法规则,由不同字符组成的两个字符串完全有可能在某种语言中被视为同一个词。
示例:strasse 和straße 这两个词在德语中与street 的含义相同。 因此,在比较表示德语单词的字符串时,必须考虑到这个语法规则,并且这两个字符串必须被视为相等(想想德国市场的应用程序,其中用户输入一条街道的名称和这条街道必须在数据库中搜索,才能得到街道所在的城市)。
到目前为止,一切都很好。
考虑到所有这些,在哪些情况下使用 .NET invariantculture 字符串 equality 有意义?
关键是不变文化(与上面示例中提到的德国文化相反)是基于美国英语语言规则的假文化。 换句话说,没有人类语言的规则基于 .NET 不变的文化,那么我为什么要使用这种虚构的文化来比较两个字符串呢?
我知道不变文化通常用于格式化和解析机器对机器通信场景中使用的字符串(例如 Web API 公开的合约)。
我想了解当使用StringComparison.InvariantCulture 而不是StringComparison.CurrentCulture 调用string.equals 时(对于某些手动设置的线程文化,为了不依赖于机器操作系统配置)真的很有意义。
【问题讨论】:
-
strasse 和 straße 是否相等,是域的函数,而不是 .net 甚至 C#。在某些情况下,您想要评估
(strasse == straße) == true,有时也需要评估(strasse == straße) == false。您的业务逻辑应该决定您如何比较字符串... -
@AustinTFrench 完全同意你的看法。这是在序数字符串比较和文化感知字符串比较之间进行选择时使用的基本原理。我的问题是使用不变的文化,而不是特定的文化(en-gb,fr-fr,ecc ...)对于文化感知字符串比较是否真的有意义。
-
InvariantCulture 是对“如果每个人的做法不同,那么标准是什么?”这个问题的简单回答。如果您有一个配置文件,该配置文件指定用户可以更改的浮点数的默认值,您可能会喜欢它。由于在部署该文件时您永远无法猜到该用户是否使用逗号或小数点,因此您必须选择一个标准。方便的。确保用户在更改时很明显,请使用“。”即使你不需要它。
-
考虑这样一种情况,您有一个字段表示程序已知但未在 UI 中公开的内容的 Name。名称将是不变的,而不是您将本地化的名称
标签: c# .net string cultureinfo invariantculture