In Java gibt es "==" und "equals" Operator für Referenztypen und "==" für Werttypen. Bei Referenztypen bedeutet "==", dass beide Objekte auf denselben Ort zeigen und "gleich" bedeutet, dass ihre Werte gleich sind. Hat C# ähnliche Operatoren für Werttypen und Referenztypen?C# == unterscheidet sich in Werttypen und Referenztypen?
Antwort
Nun, == kann für Referenztypen überladen werden. Beispiel:
Wenn es nicht überladen ist, bedeutet == "Referenzgleichheit" aka "Objektidentität" für Referenztypen. (Wie Marc sagt, können Sie Equals
ohne Überladung == überschreiben.)
Für Werttypen müssen Sie überladen == sonst wird der C# -Compiler Sie nicht für Vergleiche verwenden. .NET selbst wird eine Implementierung von Equals
bieten, die normalerweise das Richtige tut, aber manchmal langsam - in den meisten Fällen, wenn Sie Ihren eigenen benutzerdefinierten Werttyp schreiben, wollen Sie auch IEquatable<T>
implementieren und Equals
überschreiben - und möglicherweise überladen Sie verschiedene Betreiber.
C# ermöglicht es dem Bediener ==
werden überlastet (und die Equals
Methode überschrieben werden - obwohl ==
und Equals
nicht das Gleiche zu bedeuten haben).
Wenn Sie "die gleiche Instanz" meinen wollen, dann ist object.ReferenceEquals
(für Referenztypen) die beste Option. Werttypen haben standardmäßig die interne Gleichheit.
Gerade aus MSDN:
Bei vordefinierten Wertetypen, die Gleichheitsoperator (==) liefert true, wenn die Werte der Operanden gleich sind, andernfalls false. Bei Referenztypen anders als string, gibt == true zurück, wenn seine beiden Operanden auf dasselbe Objekt verweisen. Beim String-Typ vergleicht == die Werte der Strings.
Jon Skeet sollte in der Lage sein, Ihnen eine perfekte Antwort zu geben, aber: P
Das ist genau so, wie es auch mit .NET funktioniert. Die C# FAQ blog explains equals better:
Die Equals-Methode ist nur ein virtuelles ein in System.Object definiert und außer Kraft gesetzt durch Unabhängig davon, welche Klassen wählen, dies zu tun. Der Operator == ist ein Operator , der von Klassen überlastet werden kann, aber normalerweise Identitätsverhalten hat.
Für Referenztypen, bei denen == nicht überlastet wurde, vergleicht sie, ob zwei Referenzen auf dasselbe Objekt beziehen - das ist genau das, was die Implementierung von Equals tut in System.Object.
Wann sollte ich == und wann sollte ich Equals verwenden?
http://blogs.msdn.com/csharpfaq/archive/2004/03/29/102224.aspx
- 1. Wie .NET Referenz unterscheidet gegenüber primitiven und Werttypen
- 2. Speicherzuweisung von Werttypen und Referenztypen in .net Framework
- 3. Caching Werttypen C#
- 4. Referenztypen leben auf dem Heap, Werttypen leben auf dem Stack
- 5. Wie unterscheidet sich "const" in C und C++?
- 6. Unterscheidet sich die Operatorpriorität in C++ für Zeiger und Iteratoren?
- 7. Referenztypen und Vererbung gibt
- 8. Objective-C NSString Referenztypen
- 9. „ref“ Stichwort und Referenztypen
- 10. C# Array.Value unterscheidet sich von erstellt Array in C++
- 11. nBuilder füllt nur Werttypen
- 12. Warum werden Werttypen auf den Stack- und Referenztypen erstellt, die auf dem Heap erstellt wurden?
- 13. Wie unterscheidet sich Hashtable
- 14. Informationen auf Casted C# Referenztypen in Speicher
- 15. Warum unterscheidet sich {} + [] von ({} + [])?
- 16. Werttypen und Wörterbuchabruf
- 17. Texthöhe unterscheidet sich zwischen IB und Simulator
- 18. Fehler: Neudeklaration unterscheidet sich in 'constexpr'
- 19. Unterscheidet sich identifierForVendor zwischen Entwicklungs- und Distributionsversionen?
- 20. unterscheidet sich von Foo.class.barMethod() und Foo.barMethod()
- 21. C-Code unterscheidet sich von C++ bei Lookup
- 22. Sperrverhalten unterscheidet sich über Netzwerkfreigaben
- 23. hmac-sha1 in Ruby unterscheidet sich von C# HMACSHA1
- 24. Übergeben von Referenztypen nach Wert in C#
- 25. Titel in Google unterscheidet sich vom Quellcode?
- 26. Unix Zeitstempel unterscheidet sich in zwei Computern
- 27. Reihenfolge der Iteration unterscheidet sich in IE9
- 28. Warum unterscheidet sich ein SQL-Float von einem C# -Floss
- 29. C++ - Vektorelement unterscheidet sich, wenn auf verschiedene Zeiten zugegriffen wird
- 30. Gleichheit in den Referenztypen
Er hat dich schon geschlagen! – leppie
Ja, er hat mich um 46 Sekunden geschlagen! Ich wusste, während ich meine Antwort schrieb, dass Jon eine sehr gute Antwort geben würde. – Kelsey