2010-06-29 136 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)方法總是避免觸發空引用異常,無論哪個命令你傳遞兩個字符串。

相關問題