1 - Référence est égal vérifie si deux variables de type(cours, pas les structures) sont soumises à la même adresse mémoire.
2 - Le virtuel méthode Equals() vérifie si deux objets sont équivalents. Disons que vous avez de cette classe:
class TestClass{
public int Property1{get;set}
public int Property2{get;set}
public override bool Equals(object obj)
{
if (obj.GetType() != typeof(TestClass))
return false;
var convertedObj = (TestClass)obj;
return (convertedObj.Property1 == this.Property1 && convertedObj.Property2 == this.Property2);
}
}
et vous instanciez 2 les objets de cette classe:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
bien que les deux objets ne sont pas sur la même instance de TestClass, l'appel à o1.Equals(o2) retournera true.
3 - La statique de la méthode Equals est utilisé pour traiter les problèmes quand il y a une valeur null dans la case.
Imaginez ceci, par exemple:
TestClass o1 = null;
var o2 = new TestClass{property1 = 1, property2 = 2}
Si vous essayez ceci:
o1.Equals(o2);
vous allez obtenir une NullReferenceException, parce que o1 points pour rien.
Pour régler ce problème, vous n'avez ceci:
Objet.Equals(o1,o2);
Cette méthode est préparé à gérer des références nulles.
4 - La IEquatable interface est fourni par .Net si vous n'avez pas besoin de faire des moulages à l'intérieur de votre méthode Equals.
Si le compilateur trouve que vous avez mis en place l'interface dans une classe pour le type que vous essayez de vérifier l'égalité, il va donner la méthode la priorité sur l'Objet.Equals(Object) remplacer.
Par exemple:
class TestClass : IEquatable<TestClass>
{
public int Property1 { get; set; }
public int Property2 { get; set; }
public override bool Equals(object obj)
{
if (obj.GetType() != typeof(TestClass))
return false;
var convertedObj = (TestClass)obj;
return (convertedObj.Property1 == this.Property1 && convertedObj.Property2 == this.Property2);
}
#region IEquatable<TestClass> Members
public bool Equals(TestClass other)
{
return (other.Property1 == this.Property1 && other.Property2 == this.Property2);
}
#endregion
}
maintenant, si nous faisons cela:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
o1.Equals(o2);
La méthode appelée est Égal à(TestClass), avant Equals(Object).
5 - L'opérateur == signifie généralement la même que ReferenceEquals, il vérifie si les deux variables pointent vers la même adresse mémoire.
Gotcha est que cet opérateur peut être surdéfini effectuer d'autres types de contrôles.
Dans les chaînes, par exemple, il vérifie si les deux instances différentes sont équivalentes.
C'est un lien utile pour comprendre les égalités dans .Net mieux: