string.Equals(“string”)和“String”.Equals(string)有什么区别?

时间:2010-06-29 16:38:21

标签: c#

以下两行代码比较字符串值是否有任何区别。

string str = "abc";

if(str.Equals("abc"))

if("abc".Equals(str))

在第一行中我在字符串变量上调用equals方法将其与字符串文字进行比较。第二行反之亦然。它只是编码风格的差异,或者编译器处理这两个语句的方式有所不同。

5 个答案:

答案 0 :(得分:30)

唯一的区别是,在第一种情况下,当你这样做时:

str.Equals("abc")

如果strnull,您将在运行时收到异常。通过做:

"abc".Equals(str)

如果strnull,您将获得false

答案 1 :(得分:10)

不同之处在于,在第二个示例中,您永远不会得到NullReferenceException,因为文字不能为空。

答案 2 :(得分:7)

要添加到其他答案:静态string.Equals("abc", str)方法总是避免触发空引用异常,无论您传递两个字符串的顺序如何。

答案 3 :(得分:4)

正如mmyers所说,你的第二个例子不会抛出NullReferenceException并且允许程序“显示”无误运行,可能会导致意外结果。

答案 4 :(得分:1)

是的,编译器处理语句的方式不同。大多数语言中String的函数equals遵循相同的guidlines。这是一个半字节:

override def Equals(that:String):Boolean //Should override Object.Equals
  if(that==null) return false
  for i from 0 to this.length
    if(!this(i).Equals(that(i))) return false
  return true

通常情况下,该方法会检查 是一个字符串,而这个 具有相同的长度。

正如其他人所指出的,你可以看到,如果 null,该方法将返回 false 。另一方面,该方法是String的一部分,因此无法在null上调用它。这就是为什么在你的exampleif str为null时,你会得到一个NullReferenceException

话虽如此,如果你知道两个变量都是相同长度的非空字符串,那么两个语句将在同一时间内评估为相同的。