2010-06-29 127 views
9

是否有以下的该字符串值进行比较两行代码的任何差异。string.Equals(“string”)和“String”.Equals(string)的区别是什么?

string str = "abc"; 

if(str.Equals("abc")) 

if("abc".Equals(str)) 
在第一线

我呼吁字符串变量equals方法将它与字符串常量比较。第二行反之亦然。这只是编码风格的差异,还是编译器处理这两个语句的方式有所不同。

+6

旁注:' “ABC” .Equals(STR)'是绰号 “尤达条件”。 – 2010-06-29 16:44:49

+0

@Jerord,+1来告诉病情的名称。 – matrix 2010-07-02 17:15:23

回答

1

是,编译器处理语句的方式是不同的。大多数语言中的字符串函数等于遵循相同的指导。这里是一个semicode:

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该方法返回。另一方面,该方法是String的一部分,因此不能在null上调用。这就是为什么在你的exampleif str为空的情况下,你会得到一个NullReferenceException

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

10

不同的是,在第二个例子中,你将永远不会得到一个NullReferenceException因为文字不能为空。

+2

但'((string)null).Equals(str)'! (只是在开玩笑。) – 2010-06-29 16:54:16

+0

不能,永远不会。 – ANeves 2010-09-09 17:35:35

30

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

str.Equals("abc") 

如果strnull,你会得到在运行时异常。通过这样做:

"abc".Equals(str) 

如果strnull,你会得到false

+0

这是一个经典。 ; d – 2010-06-29 18:14:21

4

正如mmyers所说,你的第二个例子不会抛出一个NullReferenceException,同时允许程序“出现”运行无错误,可能会导致意想不到的结果。

7

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

相关问题