不同的字符串比较方法有何区别?

45

可能是重复问题:
C#中字符串比较方法的区别

.NET中有许多字符串比较方法,我只想确认哪一个在性能方面最好使用。

string.Equals()

string.Compare()

string.CompareTo()

string.CompareOrdinal()

string.ReferenceEquals()

if (str1 == str2)

1
我认为这个问题以前已经被问过了... - alex
3
注意 a.Equals(b) 这个方法不是完整的答案,因为如果 a 是空值 null,它会抛出 NullReferenceException 异常,而 a == b 则不会。请谨慎使用。 - Jackson Pope
这似乎与以下问题相同:https://dev59.com/3nVD5IYBdhLWcg3wO5AD。除了那里给出的答案之外,您还可以查看Jon Skeet的http://blogs.msdn.com/b/csharpfaq/archive/2004/03/29/when-should-i-use-and-when-should-i-use-equals.aspx - IAmTimCorey
1
顺便说一句:"ABC".Equals(abc_string)比abc_string.Equals("ABC")更安全。 - Random
如果您不需要进行区分性对比,但是需要进行区分大小写的比较时,String.CompareOrdinal 是更快(更有效)的选择。 - Sachin Prasad
2
这不是标记问题的重复。另一个问题根本没有提到CompareOrdinal,答案也是如此。 - SeeJayBee
1个回答

30

摘自 MSDN

string.Equals

确定此实例和一个指定的对象(该对象也必须是 String 对象)是否具有相同的值。

string.Compare 比较两个指定的 String 对象,并返回一个表示它们在排序顺序中的相对位置的整数。

string.CompareTo 将此实例与指定对象或 String 进行比较,并返回一个整数,指示此实例是在排序顺序中位于指定对象或 String 之前、之后还是与其处于同一位置。

string.CompareOrdinal 按照每个字符串中对应字符的数字值评估比较两个指定的 String 对象。

字符串相等运算符 预定义的字符串相等运算符包括:

bool operator ==(string x, string y); bool operator !=(string x, string y); 当以下条件之一为真时,两个字符串值被视为相等:

两个值均为 null。 两个值都是非 null 引用,并且它们是在每个字符位置上具有相同的长度和相同的字符的字符串实例。 字符串相等运算符比较字符串值而不是字符串引用。当两个单独的字符串实例包含完全相同的字符序列时,字符串的值是相等的,但引用是不同的。如第 7.9.6 节所述,引用类型相等运算符可用于比较字符串引用而不是字符串值。


有人能向我解释一下这句话吗?“当两个不同的字符串实例包含完全相同的字符序列时,字符串的值是相等的,但引用是不同的。” - Vinod Srivastav
8
约翰·史密斯出生于1980年1月1日。另一个人名叫约翰·史密斯,出生于1999年12月29日。这是两个不同的人,但名字完全相同。这就是两个不同字符串具有相同字符但不同引用的方式。 - The Aurochs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接