是否有以下的該字符串值進行比較兩行代碼的任何差異。string.Equals(「string」)和「String」.Equals(string)的區別是什麼?
string str = "abc";
if(str.Equals("abc"))
和
if("abc".Equals(str))
在第一線
我呼籲字符串變量equals方法將它與字符串常量比較。第二行反之亦然。這只是編碼風格的差異,還是編譯器處理這兩個語句的方式有所不同。
是否有以下的該字符串值進行比較兩行代碼的任何差異。string.Equals(「string」)和「String」.Equals(string)的區別是什麼?
string str = "abc";
if(str.Equals("abc"))
和
if("abc".Equals(str))
在第一線
我呼籲字符串變量equals方法將它與字符串常量比較。第二行反之亦然。這只是編碼風格的差異,還是編譯器處理這兩個語句的方式有所不同。
是,編譯器處理語句的方式是不同的。大多數語言中的字符串函數等於遵循相同的指導。這裏是一個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
。
話雖這麼說,如果你知道這兩個變量的長度是相同的非空字符串,這兩個語句將評估相同的在同一時間。
不同的是,在第二個例子中,你將永遠不會得到一個NullReferenceException
因爲文字不能爲空。
但'((string)null).Equals(str)'! (只是在開玩笑。) – 2010-06-29 16:54:16
不能,永遠不會。 – ANeves 2010-09-09 17:35:35
唯一的區別是,在第一種情況下,當你這樣做:
str.Equals("abc")
如果str
是null
,你會得到在運行時異常。通過這樣做:
"abc".Equals(str)
如果str
是null
,你會得到false
。
這是一個經典。 ; d – 2010-06-29 18:14:21
正如mmyers所說,你的第二個例子不會拋出一個NullReferenceException
,同時允許程序「出現」運行無錯誤,可能會導致意想不到的結果。
要添加到其他的答案:靜態string.Equals("abc", str)
方法總是避免觸發空引用異常,無論哪個命令你傳遞兩個字符串。
旁註:' 「ABC」 .Equals(STR)'是綽號 「尤達條件」。 – 2010-06-29 16:44:49
@Jerord,+1來告訴病情的名稱。 – matrix 2010-07-02 17:15:23