Equals()与静态string.Equals()的区别

4

在阅读关于C#字符串比较的信息时,我发现有许多比较两个字符串是否相等的方法。

我习惯使用C++中的==运算符,但我了解到如果将对象与字符串进行比较,==会默认返回引用值(或类似的内容)。

然后对于Equals()方法,假设我有两个字符串。

string s1 = null;
string s2 = "Hello";

如果我执行 s1.Equals(s2);,由于第一个字符串为 null,会出现 null 引用异常。但是如果我执行 string.equals(s1,s2),当其中一个值为 null 时,它只会返回 false,当两个值都为 null 时,它将返回 true,因为这两个字符串在相等性上相同,即它们都为 null。
因此,总是使用 string.equals() 方法是否有任何理由呢?另外一件事是,如果我在字符串中输入带有大写 S 的 string.equals(),如此输入仍然会以小写字母运行,但 IDE(Visual Studio 2015)会告诉我可以简化它并将其转换为小写字母 s。为什么呢?

你对 C# 中的 == 的理解是错误的。对于字符串来说,==string.Equals() 是相同的。但这在 Java 中并不成立,这可能是你混淆的原因。 - Glorin Oakenfoot
关于“string”和“String”的问题:https://dev59.com/O3VD5IYBdhLWcg3wWaRh - xanatos
@glorinη·Ζφ¨΅ε°öε™ΣδΗΣ.EqualsοΦ¹δΗéstatic string.Equals(s1, s2)γ¦Ηεê¨ψIJ - xanatos
3
你提供了一个非常明显的理由,说明为什么你不想使用String.Equals()。它会隐藏你代码中的一个严重错误。不要隐藏错误。 - Hans Passant
1
除非你真的需要进行比较,否则在检查相等性时使用String.CompareString.Equals相比会有严重的性能损失。如果你需要在紧密循环中检查成千上万个字符串,这可能并不重要,但在执行琐碎操作时可能非常重要。检查相等性比比较快得多。 - Jcl
显示剩余8条评论
2个回答

4
根据 MSDNstring.Equals 方法用于确定两个字符串对象是否具有相同的值。

确定两个 String 对象是否具有相同的值。

这就是为什么在您的情况下 string.equals(s1, s2); 总是返回 false,如果 s1s2 都为 null 或具有相同的值,则返回 true。

另外一个问题是,如果我在字符串中使用大写 S 输入 string.equals(),例如 String.equals(),那么它将像小写字母一样运行,但 IDE(Visual Studio 2015)会告诉我可以简化为小写字母 s。为什么?

"

string 是 C# 的原始数据类型,而 System.String 或简单的 String 则是相应的 FCL (Framework Class Library) 类型。这就像 intInt32 一样,其中 int 是 C# 的原始数据类型,而 Int32 是相应的 FLC 类型。

"

这就是为什么在你的情况下 string.equals(s1, s2) 总是返回 true,如果 s1 和 s2 都为 null 或具有相同的值则返回 false。你的意思是它会返回 true 对吗? - Johnson
@GeorgeOscStephan 正确的 :( 非常感谢 :) - Christos
实际上,在C#中,string不是原始类型。 - bashis

3
两种方法都执行以下步骤:
  1. 检查两个字符串是否具有相同的引用(如果是,则返回true)。它通过检查对象引用来进行此操作(它通过检查(object)a ==(object)b:两个对象变量的==运算符仅检查引用)。请注意,如果两个对象都为null,则此步骤也将返回true。
  2. 检查任何一个字符串是否为null(如果是,则返回false)
  3. 检查两个字符串长度是否匹配(如果不匹配,则返回false)
  4. 如果到了这一步,则检查每个字符的字节并查看它们是否匹配(除非您在其中一个重载中指定了StringComparison类型)(附注:即使是托管不安全代码,字节比较实现得非常好且高效...但这是您不必关心的实现细节)
无论您使用哪种方法(如果您确定实例不为null),由您决定。它们基本上都做同样的事情,并且它们的性能相同。
链接到实现:instance Equals methodstatic string.Equals 您不能在null实例上调用实例方法,这就是为什么它会为您抛出NullReferenceException的原因...然而,您的实例是null的这个事实可能很重要(取决于您的规格说明),您可能希望在比较之前检查是否为null并相应地采取行动(使用string.Equals将其隐藏起来,但可能更容易出现错误)。如果它对您的规格说明不重要,则使用其中之一仅是一个设计决策。
如果您感兴趣,两个字符串类型的运算符==的实现方式如下(源链接):source link
public static bool operator == (String a, String b) {
   return String.Equals(a, b);
}

因此,执行a == b与执行string.Equals(a,b)相同。

关于Stringstring,前者是System.String(需要在顶部添加using System;或指定整个System.String.Equals),而后者是内置别名(不需要在顶部添加using System;)。您可以使用任何一个,它们的作用完全相同。


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