2009-11-09 76 views
6

想知道爲什麼字符串的行爲類似於使用==時的值類型。爲什麼字符串的行爲類似於值類型,而使用==

  String s1 = "Hello"; 
     String s2 = "Hello"; 
     Console.WriteLine(s1 == s2);// True(why? s1 and s2 are different) 
     Console.WriteLine(s1.Equals(s2));//True 
     StringBuilder a1 = new StringBuilder("Hi"); 
     StringBuilder a2 = new StringBuilder("Hi"); 
     Console.WriteLine(a1 == a2);//false 
     Console.WriteLine(a1.Equals(a2));//true 

StringBuilder和String的行爲與==運算符不同。 謝謝。

回答

18

兩個不同的原因;

  • 實習 - 因爲"Hello"字符串(S)被編譯成源,他們相同的參考 - 檢查ReferenceEquals(s1,s2) - 它將返回true
  • 定製平等 - 字符串有平等的運營商(特別是, ==/!=(又名op_Equality/op_Inequality

StringBuilder版本失敗,因爲:

  • 它們相同的附圖(這些是在託管堆上單獨創建規則管理對象)
  • StringBuilder不會對每個操作

呼叫ToString(),和它變得更有趣:

  • 兩個字符串相同的參考
  • 但運營商的支持保證了true
+0

感謝您的回覆:-) – Wondering 2009-11-09 12:30:07

+0

所以真的..真的.. – 2009-12-22 04:45:09

8

==運算符在String類中被重載,使得字符串值被比較而不是對象引用(默認值)。

+0

爲您投票,感謝您的幫助。 – Wondering 2009-11-09 12:30:39

3

因爲==運算符被重新定義爲字符串。

MSDN

-2

使用==字符串是不好的做法,反正,只要使用equals()方法。

Details

+5

爲什麼這會造成==糟糕的做法?在內部,'=='只是調用'string.Equals(a,b)';我發現'=='更清晰。這裏唯一的一種情況是,當一個參數被輸入爲「object」時 - 是你試圖突出顯示的問題? – 2009-11-09 12:21:48

+2

不用了,謝謝。從C#移植到Java時,我非常討厭的一件事是必須使用Equals來比較字符串。相信與否,但==更具可讀性。 – Konamiman 2009-11-09 12:26:28

+4

我認爲equals只在使用StringComparison枚舉值時纔有用。 – RichardOD 2009-11-09 12:33:55

0

這是因爲運營商的平等已經重寫,以提供您看到的功能。您可以通過覆蓋equals運算符來在任何類型上執行此操作。

相關問題