2011-04-14 45 views
2

可能重複:
Please tell why two references are same for string object in case of string(Code written below)缺省情況下,==運算符是如何工作的?

當我寫在C#s1 == s2其中兩個聲明爲String的編譯器會比較引用或內容?即如果==被替換爲string類?

我只是想知道爲什麼這個代碼打印「真」:

string s1 = "hello" 
string s2 = s1 + " "; 
s2 = s2.Trim(); // i expect new object here 
Console.WriteLine(s2 == s1); 

而且我有一些第三方來源,其中==通常用於字符串比較。這讓我發瘋,因爲我幾乎從不使用==比較Java中的字符串,現在我無法理解這段代碼是如何工作的。

使用==比較C#中的字符串是否正常?

upd:感謝所有人,幾乎所有的答案都是正確的。 總之:

  • 是的,它使用「==」在C#中比較字符串
  • 字符串是正常的將內容進行比較(不參考)
  • 字符串==操作符不虛。
  • 字符串在C#中是不可變的(這類似於Java)

此行爲是對Java不同,其中「==」爲String類比較引用。

Why strings does not compare references?

看到我個人認爲語言不應該允許覆蓋或過載==操作符,因爲它使得像C++ :)

+0

由於.NET處理字符串實習的方式,通過內存位置比較字符串往往會產生意外的結果。我可以想象這是與Java的主要區別(Java是否會串入實際內存?) – MattDavey 2011-04-14 10:10:24

回答

7

運算符不能被覆蓋多態,但它們可以是重載這是字符串的情況。重載檢查內容是否平等(以序號方式,沒有文化敏感性)。因此,舉例來說:

string s1 = "hello"; 
string s2 = (s1 + " ").Trim(); 

object o1 = s1; 
object o2 = s2; 

Console.WriteLine(s1 == s2); // True - calls overloaded ==(string, string) 
Console.WriteLine(o1 == o2); // False - compares by reference 

注意這是怎麼一模一樣對象運行,但由於超負荷分辨率爲編譯時進行,在第二種情況下,編譯器不知道叫字符串特定的運算符。

3

是,默認情況下,當你使用它作爲困難==它參考equiality檢查,但它重寫爲字符串,以便它檢查的內容(因爲字符串是不可變的爲好)

This is great article that I like(兼作家喬恩是在這裏也:))

0

即使ŧ hough System.String類是一個引用類型('string'是別名)==類型的操作方法被重寫,以提供字符串類型內容之間的比較。

它們在你的例子中是相等的,因爲字符串類型的內容是相同的。

0

s2 == s1會給你一個布爾結果,是的。至於.NET編程,我總是發現使用String.Compare更好。

0

是的,將C#中的字符串與==進行比較是正常的(但不一定是好的做法)。 String.Compare是一種比較可靠的比較方式,它也可以處理不同的字符集和區分大小寫。

相關問題