Warum object.Equals und instanceobject.Equals nicht gleich sind

8
%Vor%

Hier wird das gleiche Ergebnis zurückgegeben. Jetzt, wenn ich StringBuilder verwende, gibt es nicht denselben Wert zurück. Was ist der Grund dafür?

%Vor%

Bearbeiten1 : Meine obige Frage wurde unten beantwortet. Aber während dieser Diskussion finden wir heraus, dass StringBuilder in seiner Implementierung keine Override Equals-Methode hat. Wenn wir also StringBuilder.Equals aufrufen, geht es tatsächlich zu Object.Equals. Wenn jemand StringBuilder.Equals und S1.Equals (S2) aufruft, wird das Ergebnis anders sein.

    
Pritam Karmakar 19.03.2012, 01:31
quelle

3 Antworten

7

String.Equals () wird in C # überschrieben, sodass identische Zeichenfolgen verwendet werden sind in der Tat Equal() , wenn die für Equal() definierte string Überschreibung verwendet wird.

Wenn Sie Zeichenfolgenliterale vergleichen (in Ihrem Beispiel nicht der Fall), lohnt es sich Beachten Sie, dass identische Zeichenfolgenliterale interned sind ... also identische Zeichenfolgen live sind an der gleichen Adresse wird also auch durch Referenz gleich sein (zB object.Equals () oder s1.ReferenceEquals (s2)) sowie nach Wert.

StringBuilder stellt eine Überladung für Equals() bereit, die StringBuilder als Parameter verwendet (dh s1.Equals(s2) ruft diese Überladung auf, anstatt object.Equals(object obj) aufzurufen).

Ссылка

StringBuilder.Equals () ist ...

  

true, wenn diese Instanz und sb den gleichen String, Capacity und   MaxCapacity-Werte; sonst, falsch.

object.Equals () verwendet das static Equals (), das für das Objekt definiert ist , das überprüft nur für die Referenzgleichheit (wenn eine Klasse übergeben wurde) oder für die Wertgleichheit (wenn eine Struktur übergeben wurde) .

Also zusammenfassend

%Vor%     
Eric J. 19.03.2012, 01:35
quelle
1

Die String-Klasse implementiert Equals so, dass sie die Werte der Strings vergleicht.

Die meisten Objektinstanzen überprüfen, ob das Objekt references identisch ist, sofern sie keinen anderen Vergleichstyp verwenden.

Beachten Sie, dass es auch einen Fall gibt, in dem zwei verschiedene Zeichenfolgenkonstanten, die genau denselben Wert enthalten, anfänglich der gleichen Objektverweis vom Compiler zugewiesen werden.

    
competent_tech 19.03.2012 01:37
quelle
1

Die generische Equals-Methode vergleicht die Referenzen zweier Objekte, um zu sehen, ob sie Referenz Gleichheit für Referenztypen wie StringBuilder . Für Werttypen und string verhält sich wie ein Werttyp (ist unveränderlich), führt einen bitweisen Vergleich durch (bestimmt, ob die Binärdarstellung identisch ist). Diese Funktionalität ist jedoch in der StringBuilder-Klasse überladen.

Laut MSDN gibt die gleiche Methode des StringBuilders true zurück, wenn die folgenden Kriterien für beide gelten StringBuilder-Objekte sind gleich:

  • Zeichenfolge
  • Kapazität
  • MaxCapacity

Somit scheitern s1 und s2 im zweiten Beispiel an der Referenzgleichheit, übergeben aber die benutzerdefinierte Gleichheit von StringBuilder Gleichheit basierend auf den eben genannten Kriterien.

    
Matt 19.03.2012 01:34
quelle

Tags und Links