|
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
|
Übersetzung
Original
|
Object.Equals-Methode (Object)
Namespace: System
Assembly: mscorlib (in mscorlib.dll)
Parameter
- obj
- Typ: System.Object
Das Objekt, das mit dem aktuellen Objekt verglichen werden soll.
Rückgabewert
Typ: System.Booleanusing System; // Define a reference type that does not override Equals. public class Person { private string personName; public Person(string name) { this.personName = name; } public override string ToString() { return this.personName; } } public class Example { public static void Main() { Person person1a = new Person("John"); Person person1b = person1a; Person person2 = new Person(person1a.ToString()); Console.WriteLine("Calling Equals:"); Console.WriteLine("person1a and person1b: {0}", person1a.Equals(person1b)); Console.WriteLine("person1a and person2: {0}", person1a.Equals(person2)); Console.WriteLine("\nCasting to an Object and calling Equals:"); Console.WriteLine("person1a and person1b: {0}", ((object) person1a).Equals((object) person1b)); Console.WriteLine("person1a and person2: {0}", ((object) person1a).Equals((object) person2)); } } // The example displays the following output: // person1a and person1b: True // person1a and person2: False // // Casting to an Object and calling Equals: // person1a and person1b: True // person1a and person2: False
Die beiden Objekte sind vom gleichen Typ. Wie das folgende Beispiel zeigt, entspricht ein Byte Objekt, das einen Wert von 12 hat nicht einem
Int32 Objekt, das ebenfalls einen Wert von 12 hat, da die beiden Objekte verschiedene Laufzeittypen haben.
using System; public class Example { public static void Main() { byte value1 = 12; int value2 = 12; object object1 = value1; object object2 = value2; Console.WriteLine("{0} ({1}) = {2} ({3}): {4}", object1, object1.GetType().Name, object2, object2.GetType().Name, object1.Equals(object2)); } } // The example displays the following output: // 12 (Byte) = 12 (Int32): False
Die Werte der öffentlichen und privaten Felder der beiden Objekte sind gleich. Im folgenden Beispiel wird die Wertgleichheit überprüft. Sie definiert eine Person-Struktur, die ein Werttyp ist, und ruft den Person-Klassenkonstruktor auf, um zwei neue Person-Objekte, person1 und person2, zu instanziieren, die denselben Wert haben. Wie die Ausgabe im Beispiel zeigt, obwohl die zwei Objektvariablen verschiedene Objekte verweisen, person1 und person2 gleich sind, da sie den gleichen Wert für das private personName Feld verfügen. using System; // Define a value type that does not override Equals. public struct Person { private string personName; public Person(string name) { this.personName = name; } public override string ToString() { return this.personName; } } public struct Example { public static void Main() { Person person1 = new Person("John"); Person person2 = new Person("John"); Console.WriteLine("Calling Equals:"); Console.WriteLine(person1.Equals(person2)); Console.WriteLine("\nCasting to an Object and calling Equals:"); Console.WriteLine(((object) person1).Equals((object) person2)); } } // The example displays the following output: // Calling Equals: // True // // Casting to an Object and calling Equals: // True
Hinweise für Aufrufer
using System; using System.Text; public class Example { public static void Main() { StringBuilder sb1 = new StringBuilder("building a string..."); StringBuilder sb2 = new StringBuilder("building a string..."); Console.WriteLine("sb1.Equals(sb2): {0}", sb1.Equals(sb2)); Console.WriteLine("((Object) sb1).Equals(sb2): {0}", ((Object) sb1).Equals(sb2)); Console.WriteLine("Object.Equals(sb1, sb2): {0}", Object.Equals(sb1, sb2)); Object sb3 = new StringBuilder("building a string..."); Console.WriteLine("\nsb3.Equals(sb2): {0}", sb3.Equals(sb2)); } } // The example displays the following output: // sb1.Equals(sb2): True // ((Object) sb1).Equals(sb2): False // Object.Equals(sb1, sb2): False // // sb3.Equals(sb2): False
Hinweise zur Vererbung
Object.Equals(Object) | ||
Object.Equals(Object) |
public class Person { private string idNumber; private string personName; public Person(string name, string id) { this.personName = name; this.idNumber = id; } public override bool Equals(Object obj) { Person personObj = obj as Person; if (personObj == null) return false; else return idNumber.Equals(personObj.idNumber); } public override int GetHashCode() { return this.idNumber.GetHashCode(); } } public class Example { public static void Main() { Person p1 = new Person("John", "63412895"); Person p2 = new Person("Jack", "63412895"); Console.WriteLine(p1.Equals(p2)); Console.WriteLine(Object.Equals(p1, p2)); } } // The example displays the following output: // True // True
x.Equals(x) gibt true, außer in Fälle zurück, die Gleitkommatypen einschließen. Siehe ISO/IEC/IEEE 60559:2011, Informationstechnologie -- Mikroprozessor-Systeme -- Gleitkommaarithmetik. x.Equals(y) gibt den gleichen Wert wie y.Equals(x) zurück. x.Equals(y) true gibt zurück, wenn x und yNaN sind. Wenn (x.Equals(y) && y.Equals(z))true zurückgibt, gibt x.Equals(z)true zurück. Aufeinander folgende Aufrufe x.Equals(y) geben den gleichen Wert zurück, solange die Objekte, die von x und y verweisen, werden nicht geändert. x.Equals(null) gibt false zurück.
Typen, die IComparable implementieren, müssen Equals(Object) überschreiben. Typen, die Equals(Object) überschreiben, müssen GetHashCode auch überschreiben; Andernfalls funktionieren möglicherweise nicht ordnungsgemäß Hashtabellen. Wenn die Programmiersprache Operatorüberladung unterstützt und Sie den Gleichheitsoperator für einen angegebenen Typ überladen, müssen Sie die Equals(Object)-Methode auch überschreiben, um das gleiche Ergebnis wie der Gleichheitsoperator zurückzugeben. Dies hilft, sicherzustellen, dass Klassenbibliothekscode, der Equals verwendet (z ArrayList und Hashtable) in ähnlicher Weise, das mit der - Methode der Gleichheitsoperator konsistent ist, wird mithilfe von Anwendungscode verhält.
Richtlinien für Verweistypen
Erwägen Sie, Equals zu überschreiben, wenn die Semantik des Typs auf Grundlage der Tatsache ist, dass der Typ einige Werte darstellt. Referenztypen dürfen den Gleichheitsoperator i. d. R. auch dann nicht überladen, wenn sie Equals überschreiben. Wenn Sie allerdings einen Referenztyp implementieren, der Wertsemantik besitzen soll, z. B. einen Typ, der komplexe Zahlen darstellt, müssen Sie den Gleichheitsoperator überschreiben.
Richtlinien für Werttypen
Wenn Sie einen Werttyp definieren, der ein oder mehrere Felder umfasst, deren Werte Verweistypen sind, sollten Sie Equals(Object) überschreiben. Die Equals(Object) Implementierung, die von ValueType bereitgestellt wird, führt einen Vergleich auf Byteebene für Werttypen, deren Felder alle Werttypen sind, aber er verwendet Reflektion, um einen Feld-durchFeldvergleich von Werttypen auszuführen, deren Felder Verweistypen umfassen. Wenn Sie Equals und die Entwicklungssprachunterstützungsoperatorüberladung überschreiben, müssen Sie den Gleichheitsoperator überladen.
using System; class Point { protected int x, y; public Point() { this.x = 0; this.y = 0; } public Point(int X, int Y) { this.x = X; this.y = Y; } public override bool Equals(Object obj) { //Check for null and compare run-time types. if (obj == null || this.GetType() != obj.GetType()) { return false; } else { Point p = (Point) obj; return (x == p.x) && (y == p.y); } } public override int GetHashCode() { return x ^ y; } } class Point3D: Point { int z; public Point3D(int X, int Y, int Z) { this.x = X; this.y = Y; this.z = Z; } public override bool Equals(Object obj) { return base.Equals(obj) && z == ((Point3D)obj).z; } public override int GetHashCode() { return base.GetHashCode() ^ z; } } class Example { public static void Main() { Point point2D = new Point(5, 5); Point3D point3Da = new Point3D(5, 5, 2); Point3D point3Db = new Point3D(5, 5, 2); if (!point2D.Equals(point3Da)) { Console.WriteLine("point2D does not equal point3Da"); } if (!point3Db.Equals(point2D)) { Console.WriteLine("point3Db does not equal point2D"); } if (point3Da.Equals(point3Db)) { Console.WriteLine("point3Da equals point3Db"); } } } // The example displays the following output: // point2D does not equal point3Da // point3Db does not equal point2D // point3Da equals point3Db
using System; class Rectangle { Point a, b; public Rectangle(int upLeftX, int upLeftY, int downRightX, int downRightY) { this.a = new Point(upLeftX, upLeftY); this.b = new Point(downRightX, downRightY); } public override bool Equals(Object obj) { // Performs an equality check on two rectangles (Point object pairs). if (obj == null || GetType() != obj.GetType()) return false; Rectangle r = (Rectangle)obj; //Uses Equals to compare variables. return a.Equals(r.a) && b.Equals(r.b); } public override int GetHashCode() { return a.GetHashCode() ^ b.GetHashCode(); } } class Point { private int x; private int y; public Point(int X, int Y) { this.x = X; this.y = Y; } public override bool Equals (Object obj) { // Performs an equality check on two points (integer pairs). if (obj == null || GetType() != obj.GetType()) return false; Point p = (Point)obj; return (x == p.x) && (y == p.y); } public override int GetHashCode() { return x.GetHashCode() ^ y.GetHashCode(); } } class Example { public static void Main() { Rectangle r1 = new Rectangle(0, 0, 100, 200); Rectangle r2 = new Rectangle(0, 0, 100, 200); Rectangle r3 = new Rectangle(0, 0, 150, 200); if (r1.Equals(r2)) { Console.WriteLine("Rectangle r1 equals rectangle r2!"); } if (!r2.Equals(r3)) { Console.WriteLine("But rectangle r2 does not equal rectangle r3."); } } } // The example displays the following output: // Rectangle r1 equals rectangle r2! // But rectangle r2 does not equal rectangle r3.
using System; public struct Complex { public double re, im; public override bool Equals(Object obj) { return obj is Complex && this == (Complex)obj; } public override int GetHashCode() { return re.GetHashCode() ^ im.GetHashCode(); } public static bool operator ==(Complex x, Complex y) { return x.re == y.re && x.im == y.im; } public static bool operator !=(Complex x, Complex y) { return !(x == y); } } class MyClass { public static void Main() { Complex cmplx1, cmplx2; cmplx1.re = 4.0; cmplx1.im = 1.0; cmplx2.re = 2.0; cmplx2.im = 1.0; if (cmplx1 != cmplx2) Console.WriteLine("The two objects are not equal."); if (! cmplx1.Equals(cmplx2)) Console.WriteLine("The two objects are not equal."); cmplx2.re = 4.0; if (cmplx1 == cmplx2) Console.WriteLine("The two objects are now equal!"); if (cmplx1.Equals(cmplx2)) Console.WriteLine("The two objects are now equal!"); } } // The example displays the following output: // The two objects are not equal. // The two objects are not equal. // The two objects are now equal! // The two objects are now equal!
Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.