当在c#中比较两个相等的字符串时,不变文化和序数比较之间有什么区别?


当前回答

不变量是一种语言上合适的比较类型。 序数是一种二进制类型的比较。(快) 参见http://www.siao2.com/2004/12/29/344136.aspx

其他回答

指向在.NET框架中使用字符串的最佳实践:

使用接受StringComparison。序数或字符串比较。OrdinalIgnoreCase用于比较,作为与区域性无关的字符串匹配的安全默认值。 使用StringComparison进行比较。序数或字符串比较。OrdinalIgnoreCase获得更好的性能。 使用非语言的StringComparison。序数或字符串比较。OrdinalIgnoreCase值而不是基于CultureInfo的字符串操作。当比较在语言上是不相关的(例如,符号的)时,使用InvariantCulture。

最后:

不要使用基于StringComparison的字符串操作。在大多数情况下是不变文化。少数例外之一是当您坚持使用语言上有意义但文化上不可知的数据时。

这确实很重要,比如——有一种东西叫做角色扩展

var s1 = "Strasse";
var s2 = "Straße";

s1.Equals(s2, StringComparison.Ordinal);           //false
s1.Equals(s2, StringComparison.InvariantCulture);  //true

使用InvariantCulture, ß字符扩展为ss。

不变量是一种语言上合适的比较类型。 序数是一种二进制类型的比较。(快) 参见http://www.siao2.com/2004/12/29/344136.aspx

总是尝试在那些接受它作为重载的字符串方法中使用InvariantCulture。通过使用InvariantCulture,你是安全的。许多。net程序员可能不会使用这个功能,但如果您的软件将被不同的区域性使用,那么InvariantCulture是一个非常方便的特性。

下面是一个例子,使用InvariantCultureIgnoreCase和OrdinalIgnoreCase进行字符串相等性比较将不会给出相同的结果:

string str = "\xC4"; //A with umlaut, Ä
string A = str.Normalize(NormalizationForm.FormC);
//Length is 1, this will contain the single A with umlaut character (Ä)
string B = str.Normalize(NormalizationForm.FormD);
//Length is 2, this will contain an uppercase A followed by an umlaut combining character
bool equals1 = A.Equals(B, StringComparison.OrdinalIgnoreCase);
bool equals2 = A.Equals(B, StringComparison.InvariantCultureIgnoreCase);

如果你运行这个,equals1将为假,而equals2将为真。