2013-05-20 23 views
7

Używam tego kodu i uzyskać prawdziwy wynik:Jak porównać dwa obiekty, które mają wartości ciągów?

object text1 = "test"; 
object text2 = "test"; 
Console.WriteLine("text1 == text2 : " + (text1 == text2)); 
//return:true 

Ale gdy próbuję dolna: object text2 = "test".ToLower(); ja dostać false wynik?

object text1 = "test".ToLower(); 
    object text2 = "test".ToLower(); 
    Console.WriteLine("text1 == text2 : " + (text1 == text2)); 
  //return:false 

Odpowiedz

14

W pierwszym przypadku, jesteś porównywania dwóch ciągów za pomocą równości odniesienia, ale oba łańcuchy są interned strings.

W drugim przypadku, gdy wywołujesz ToLower() na łańcuchu, tworzy nowy ciąg, więc porównujesz dwie nowe instancje łańcuchów, które nie są tą samą instancją w porównaniu z równaniem odniesienia.

Jeśli do porównania z metodą String.Equals, a nie używać Object.Equals, przekonasz się, że powróci prawda, ponieważ String.Equals porówna opiera się wartość zawartego w ciągu, a nie rzeczywiste referencje obiektów.

+0

W rzeczywistości operator równości ma na celu ** wartość **, a nie referencję: http://msdn.microsoft.com/en-us/library/system.string.op_equality.aspx –

+0

Ok, teraz ja " Widziałem twoją aktualizację. Obiekt '==' ma na celu odniesienie. –

+1

@AndreCalil 'String.Equality' ma, ale' Object.Equals' używa równania odniesienia, co jest tym, co powiedziałem. –

3

Zakładam, że dzieje się tak dlatego, że testujesz równość obiektów, a nie równość łańcuchów.

To znaczy, że w pierwszym przykładzie kompilator zapisał tekst1 i tekst2 w tym samym obiekcie, ponieważ zawartość jest taka sama. W drugim przykładzie nowe obiekty są zwracane przez wywołanie ToLower(), a więc nie są już tym samym obiektem.

Jeśli zmienisz zadeklarowany typ pamięci z obiektu na łańcuch, powinieneś zobaczyć pożądane zachowanie.

Powiązane problemy