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

mat*_*rix 9 c#

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

string str = "abc";

if(str.Equals("abc"))
Run Code Online (Sandbox Code Playgroud)

if("abc".Equals(str))
Run Code Online (Sandbox Code Playgroud)

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

Ree*_*sey 30

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

str.Equals("abc")
Run Code Online (Sandbox Code Playgroud)

如果strnull,您将在运行时获得异常.通过做:

"abc".Equals(str)
Run Code Online (Sandbox Code Playgroud)

如果str是的话null,你会得到的false.


Mic*_*ers 10

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

  • 但是`((string)null).Equals(str)`!(开玩笑.) (2认同)

Tim*_*son 7

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


Sku*_*uge 1

是的,编译器处理语句的方式是不同的。大多数语言中的 String 函数 equals 都遵循相同的准则。这是一个半代码:

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
Run Code Online (Sandbox Code Playgroud)

通常,该方法将首先检查 that一个字符串,并且thisthat具有相同的长度。

正如其他人指出的那样,您可以看到,如果是这样null该方法将返回false。另一方面,该方法是 String 的一部分,因此不能在 上调用null。这就是为什么在您的示例中如果 str 为 null 您将得到一个NullReferenceException.

话虽如此,如果您知道两个变量都是相同长度的非空字符串,则两个语句将同时计算出相同的值。