2009-11-09 14 views
6

chce wiedzieć, dlaczego ciąg zachowuje się jak typ wartości podczas używania ==.Dlaczego łańcuch zachowuje się jak typ wartości podczas używania ==

  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 i String działają inaczej z operatorem ==. Dzięki.

Odpowiedz

18

Dwa różne powody;

  • interning - ponieważ łańcuch (y) "Hello" są kompilowane do źródła, oni samo odniesienie - sprawdź ReferenceEquals(s1,s2) - powróci true
  • niestandardową równości - ciąg ma operatorów równości (w szczególności ==/!= (aka op_Equality/op_Inequality)

wersja StringBuilder powiodło się, ponieważ:

  • one nie samo odniesienie (są regularne zarządzane obiekty utworzone oddzielnie na zarządzanej stercie)
  • StringBuilder nie mają operatorzy

połączeń ToString() na siebie, a to staje się bardziej interesująca:

  • dwa ciągi nie są samo odniesienie
  • ale wsparcie operator gwarantuje true
+0

Dzięki za odpowiedź ur :-) – Wondering

+0

tak prawdziwe .. tak prawdziwe .. –

8

Operator == jest przeciążony w klasie String, w taki sposób, że porównywane są wartości łańcuchów zamiast odwołań do obiektów, co jest wartością domyślną.

+0

zagłosuj na ciebie, dzięki za pomoc. – Wondering

3

Ponieważ operator == operator przedefiniował ciągi znaków.

Zobacz MSDN

-2

Korzystanie == ciągów jest złą praktyką Tak czy inaczej, po prostu korzystać z equals().

Details

+5

I dlaczego to sprawia, że ​​== złe praktyki? Wewnętrznie, '==' po prostu wywołuje 'string.Equals (a, b)'; Znajduję '==' jaśniejszy. Jedynym przykładem jest tu, kiedy jeden parametr jest wpisany jako "obiekt" - czy problem, który próbujesz podkreślić? –

+2

Nie, dziękuję. Jedną z rzeczy, których naprawdę nienawidzę przy przechodzeniu z języka C# na język Java, jest użycie równań do porównywania łańcuchów. Wierz lub nie, ale == jest bardziej czytelny. – Konamiman

+4

Myślę, że equals jest przydatny tylko wtedy, gdy chcesz użyć jednej z wartości wyliczeniowych StringComparison. – RichardOD

0

To dlatego operator równości została zastąpiona w celu zapewnienia funkcjonalności widzisz. Możesz to zrobić na dowolnym typie, przesłonić operatora równości.

Powiązane problemy