根据我的理解(请参阅我的另一个问题),为了决定是否使用序数或文化规则来测试字符串相等性,必须考虑执行比较的语义。
如果必须将两个比较字符串视为原始字符序列(换句话说,两个符号),则必须执行序数字符串比较。在服务器端代码中执行的大多数字符串比较都是这种情况。
示例:通过用户名执行用户查找。在这种情况下,可用用户的用户名和搜索到的用户名只是符号,它们不是特定语言的单词,因此在比较它们时无需考虑语言因素。在这种情况下,由不同字符组成的两个符号必须被认为是不同的,而不管任何语言规则。
如果必须将两个比较的字符串视为特定语言中的单词,则在比较过程中必须考虑文化规则。根据该语言的语法规则,由不同字符组成的两个字符串完全有可能在某种语言中被视为同一个单词。
示例:这两个词strasse
和在德语中straße
具有相同的含义。因此,在比较表示德语单词的字符串的上下文中,必须考虑这个语法规则并且这两个字符串必须被认为是相等的(想想德国市场的应用程序,其中用户输入街道名称并且街道必须在数据库中搜索,才能得到街道所在的城市)。street
到目前为止,一切都很好。
鉴于所有这些,在哪些情况下使用 .NET不变文化来实现字符串相等是有意义的?
关键是不变文化(与上面示例中提到的德国文化相反)是基于美国英语语言规则的假文化。换句话说,没有人类语言的规则基于 .NET 不变的文化,那么我为什么要使用这种虚构的文化来比较两个字符串呢?
我知道不变文化通常用于格式化和解析机器对机器通信场景中使用的字符串(例如 Web API 公开的合约)。
我想了解调用string.equals
usingStringComparison.InvariantCulture
而不是StringComparison.CurrentCulture
(对于某些手动设置的线程文化,以便不依赖于机器操作系统配置)真的很有意义。