1 - Referenz equals prüft, ob zwei Referenztypvariablen (Klassen, nicht Strukturen) auf dieselbe Speicheradresse verweisen.
2 - Die virtuelle Equals() -Methode prüft, ob zwei Objekte äquivalent sind.Lassen Sie uns sagen, dass Sie diese Klasse haben:
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);
}
}
und Sie instanziieren 2 Objekte aus dieser Klasse:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
obwohl die beiden Objekte nicht die gleiche Instanz von Testclass sind, um den Anruf zu o1.Equals (o2) wird wahr zurückgeben.
3 - Die statische Equals-Methode wird verwendet, um Probleme zu behandeln, wenn bei der Prüfung ein Nullwert vorhanden ist. Stellen Sie sich vor, zum Beispiel:
TestClass o1 = null;
var o2 = new TestClass{property1 = 1, property2 = 2}
Wenn Sie versuchen, diese:
o1.Equals(o2);
Sie eine Nullreferenceexception, weil o1 Punkte bekommen nichts wil. Um dieses Problem zu beheben, tun Sie dies:
Object.Equals (o1, o2);
Diese Methode ist für die Verarbeitung von Nullreferenzen vorbereitet.
4 - Die IEquatable-Schnittstelle wird von .Net zur Verfügung gestellt, so dass Sie innerhalb Ihrer Equals-Methode keine Umwandlungen durchführen müssen. Wenn der Compiler feststellt, dass Sie die Schnittstelle in einer Klasse für den Typ implementiert haben, den Sie auf Gleichheit prüfen möchten, wird dieser Methode Vorrang vor der Override Object.Equals (Object) gegeben. Zum Beispiel:
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
}
jetzt, wenn wir dies tun:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
o1.Equals(o2);
Die aufgerufene Methode ist Equals (Testclass) vor Equals (Object).
5 - Der Operator == bedeutet normalerweise dasselbe wie ReferenceEquals, es prüft, ob zwei Variablen auf die gleiche Speicheradresse zeigen. Das Problem besteht darin, dass dieser Operator für die Durchführung anderer Überprüfungen außer Kraft gesetzt werden kann. In Strings prüft es zum Beispiel, ob zwei verschiedene Instanzen äquivalent sind.
Dies ist eine nützliche Verbindung Gleichheiten in .Net besser zu verstehen:
Excellent. Die Beispiele helfen wirklich, aber es gibt einen Tippfehler in deinem Punkt 4, wo das IEquatable.Equals immer noch 'convertedObj' verwendet – PaulG
Danke PaulG, es ist jetzt behoben! =] – mverardo