|
Cet article a fait l'objet d'une traduction automatique. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. Informations supplémentaires.
|
Traduction
Source
|
Object.Equals, méthode (Object)
Espace de noms : System
Assembly : mscorlib (dans mscorlib.dll)
Paramètres
- obj
- Type : System.Object
Objet à comparer avec l'objet actif.
Valeur de retour
Type : 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
Les deux objets sont du même type. Comme le montre l'exemple suivant, un objet d' Byte qui a la valeur 12 n'est pas un objet d' Int32 qui a la valeur 12, car les deux objets ont différents types d'exécution. 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
Les valeurs des champs publics et privés les deux objets sont égaux. L'exemple suivant teste d'égalité des valeurs. Elle définit une structure d' Person , qui est un type valeur, et appelle le constructeur de classe d' Person pour instancier deux nouveaux objets, person1 et person2d' Person , qui ont la même valeur. Comme la sortie de l'exemple, bien que les deux variables objets font référence à des objets, person1 et person2 sont égale car ils ont la même valeur pour le champ privé d' personName . 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
Remarques relatives aux appelants
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
Remarques à l'attention des héritiers
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) retourne true, sauf dans les cas qui impliquent des types à virgule flottante. Consultez 60559:2011 d'ISO/IEC/IEEE, technologie d'informations -- systèmes de microprocesseur -- calcul à virgule flottante. x.Equals(y) retourne la même valeur que y.Equals(x). x.Equals(y) retourne true si x et y sont NaN. Si (x.Equals(y) && y.Equals(z)) retourne true, puis x.Equals(z) retourne true. Les appels successifs à x.Equals(y) retournent la même valeur tant que les objets référencés par x et y ne sont pas modifiés. x.Equals(null) retourne false.
Les types qui implémentent IComparable doivent substituer Equals(Object). Les types qui substituent Equals(Object) doivent substituer GetHashCode; sinon, les tables de hachage ne pas fonctionner correctement. Si votre surcharge d'opérateur et vous de programmation de prises en charge surcharge l'opérateur d'égalité d'un type donné, vous devez substituer la méthode d' Equals(Object) pour retourner le même résultat que l'opérateur d'égalité. Cela permet de garantir que le code de bibliothèque de classes qui utilise Equals (tel qu' ArrayList et Hashtable) se comporte d'une manière qui est compatible avec la manière dont l'opérateur d'égalité est utilisé par du code d'application.
Indications pour les types référence
Envisagez de remplacer Equals si la sémantique de type sont basés sur le fait que le type représente des valeurs. La plupart des types référence ne doivent pas surcharger l'opérateur d'égalité, même s'ils substituent la méthode Equals. Cependant, si vous implémentez un type référence qui doit avoir une sémantique de valeur, telle qu'un type nombre complexe, vous devez substituer l'opérateur d'égalité.
Indications pour les types valeur
Si vous définissez un type valeur qui inclut un ou plusieurs champs dont les valeurs sont des types référence, vous devez substituer Equals(Object). L'implémentation d' Equals(Object) fournie par ValueType effectue une comparaison octet par octet pour les types valeur dont les champs sont des types valeur, mais il utilise la réflexion pour effectuer une comparaison de champ-par- champ des types valeur dont les champs sont des types référence. Si vous substituez Equals et la surcharge d'opérateur de prises en charge de développement, vous devez surcharger l'opérateur d'égalité.
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 (rôle principal du serveur non pris en charge), Windows Server 2008 R2 (rôle principal du serveur pris en charge avec SP1 ou version ultérieure ; Itanium non pris en charge)
Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.