Erklärung der öffentlichen Methoden in Object:
Öffentliche Methoden:
Equals:
public class Object {
public virtual Boolean Equals(Object obj )
{
//Wenn zwei Referenzen auf dasselbe Objekt verweisen, müssen sie denselben Wert enthalten
if (this == obj) return true;
false zurückgeben;
}
}
Angenommen, dass sich this und obj-Instanzen auf dasselbe Objekt beziehen, wird true zurückgegeben. Dies erscheint vernünftig, da Equals weiß, dass das Objekt denselben Wert wie es selbst enthalten muss. Wenn sich die Instanzen jedoch auf unterschiedliche Objekte beziehen, ist Equals nicht sicher, ob die Objekte denselben Wert enthalten, und gibt daher false zurück. Mit anderen Worten: Bei der Standardimplementierung der Equals-Methode von Object wird tatsächlich Identität und nicht Gleichheit implementiert.
Die korrekte Implementierung der Equals-Methode:
1. Wenn der tatsächliche Parameter obj null ist, geben Sie false zurück, da beim Aufruf der nicht statischen Equals-Methode das aktuelle Objekt dadurch identifiziert wird Offensichtlich kann es nicht null sein
2, wenn sich dieser und die tatsächlichen Parameter obj auf dasselbe Objekt beziehen, wird „true“ zurückgegeben. Dieser Schritt kann dazu beitragen, die Leistung beim Vergleich von Objekten zu verbessern, die eine große Anzahl von Feldern enthalten.
3 Wenn sich die Argumente this und obj auf Objekte unterschiedlichen Typs beziehen, geben Sie false zurück. Ein String-Objekt ist offensichtlich nicht gleich einem FileStream-Objekt
4 Vergleichen Sie für jedes durch den Typ definierte Feld den Wert in diesem Objekt mit dem Wert im obj-Objekt. Wenn ein Feld nicht gleich ist, ist es falsch
5. Rufen Sie die Equals-Methode der Basisklasse auf, um jedes von ihr definierte Feld zu vergleichen. Wenn die Equals-Methode der Basisklasse „false“ zurückgibt, gibt sie andernfalls „true“ zurück
Hinweis:
Der Test auf Identitätsprobleme verwendet die statische Methode ReferenceEquals von Object, deren Prototyp wie folgt lautet:
public static Boolean ReferenceEquals(Object objA, object objB)
{
return (objA==objB);
}
Überprüfen Sie das Identitätsproblem (um festzustellen, ob die beiden Referenzen auf dasselbe Objekt verweisen). Verwenden Sie nicht den C#-Operator == (es sei denn, Sie konvertieren zuerst beide Operanden in Object), da der Typ eines bestimmten Operanden möglicherweise mit dem Operator == überladen wird und der zugewiesene Wert eine andere Semantik als die Identität aufweist.
System. ValueType (die Basisklasse aller Werttypen) überschreibt die Equals-Methode von Object und implementiert die korrekte Implementierung, um Gleichheitsprüfungen von Werten durchzuführen (anstelle von Identitätsprüfungen). Die interne Implementierung von Equals of ValueType lautet wie folgt:
1, wenn der obj-Aktualparameter null ist, geben Sie „false“ zurück
2, wenn sich dieser und obj-Aktualparameter auf Objekte unterschiedlichen Typs beziehen, geben Sie „false“ zurück
3, für jede Typdefinition Instanzfelder vergleichen alle den Wert in diesem Objekt mit dem Wert im Objekt obj (anstelle einer Identitätsprüfung). Die interne Implementierung von Equals of ValueType lautet wie folgt:
1, wenn der obj-Aktualparameter null ist, wird false zurückgegeben
2, wenn sich dieser und die obj-Aktualparameter auf Objekte unterschiedlichen Typs beziehen, return false
3. Vergleichen Sie für jedes durch den Typ definierte Instanzfeld den Wert in diesem Objekt mit dem Wert im obj-Objekt (durch Aufrufen der equal-Methode des Felds). false
4, gibt true zurück. Die Equals-Methode von ValueType ruft nicht die Equals-Methode von Object
auf. Intern verwendet die Equals-Methode von ValueType Reflektion, um den obigen Schritt 3 abzuschließen. Da der CLR-Reflektionsmechanismus langsam ist, sollten Sie die Equals-Methode überschreiben Geben Sie beim Definieren Ihres eigenen Werttyps Ihre eigene Implementierung an und verbessern Sie so die Leistung des Gleichheitsvergleichs der Stärke Ihres eigenen Typs. Natürlich ruft Ihre eigene Implementierung nicht base.Equals auf.
Hinweis:
wird bei der Definition Ihres eigenen Typs überschrieben.
1, Equals muss reflexiv sein: x.Equals(x) muss true zurückgeben
2 , Equals muss symmetrisch sein: x.Equals(y) und y.Equals(x) geben den gleichen Wert zurück
3, Equals muss übertragbar sein: x.Equals(y) gibt true zurück, y.Equals(z ) gibt true zurück, dann muss x.Equals(z) true zurückgeben
4, Equals muss konsistent sein. Der Vergleich zweier Werte bleibt unverändert und der Rückgabewert von Equals bleibt unverändert
GetHashCode:
Wenn die von Ihnen definierte Klasse die Equals-Methode überschreibt, müssen Sie sie auch überschreiben die GetHashCode-Methode. Der Grund für diese Anforderung besteht darin, dass die Implementierung des Typs System.Collections.Hashtable, des Typs System.Collection.Generic.Dictionary und einiger anderer Sammlungen erfordert, dass zwei Objekte denselben Hashcode haben müssen, um als gleich zu gelten. Wenn Sie Equals neu schreiben, müssen Sie daher GetHashCode neu schreiben, um die Konsistenz des Gleichheitsalgorithmus und des Objekt-Hash-Code-Algorithmus sicherzustellen. Um es einfach auszudrücken: Um einer Sammlung ein Schlüssel/Wert-Paar hinzuzufügen, müssen Sie zunächst den Hash-Code des Objekts abrufen. Der Hash-Code gibt an, in welchem Hash-Bucket das Schlüssel/Wert-Paar gespeichert werden soll. Wenn eine Sammlung einen Schlüssel suchen muss, ruft sie den Hash-Code des angegebenen Schlüsselobjekts ab, der den Hash-Bucket identifiziert, der nun sequenziell durchsucht werden soll, wobei nach Schlüsselobjekten gesucht wird, die dem angegebenen Schlüsselobjekt entsprechen . Die Verwendung dieses Algorithmus zum Speichern und Suchen von Schlüsseln bedeutet, dass die Sammlung das Objekt nicht mehr finden kann, sobald ein Schlüsselobjekt in der Sammlung geändert wird. Wenn Sie das Schlüsselobjekt in der Hash-Tabelle ändern müssen, besteht der richtige Ansatz daher darin, das ursprüngliche Schlüssel-/Wertpaar zu entfernen, das Schlüsselobjekt zu ändern und dann das neue Schlüssel-/Wertpaar wieder zur Hash-Tabelle hinzuzufügen.
Das Anpassen der GetHashCode-Methode ist möglicherweise nicht schwierig, hängt jedoch vom Datentyp und der Datenverteilung ab. Nachfolgend finden Sie ein Beispiel und eine Regel:
interner versiegelter Klassenpunkt
{
private readonly Int32 m_x, m_y;
public override int GetHashCode()
{
return m_x ^ m_y; //Das XOR-Ergebnis von m_x und m_y zurückgeben
}
}
Regel:
1, dieser Algorithmus sollte Durch die Bereitstellung einer guten Zufallsverteilung kann die Hash-Tabelle die beste Leistung erzielen.
2 Die akkumulierte GetHashCode-Methode kann im Algorithmus aufgerufen und ihr Rückgabewert einbezogen werden. Rufen Sie jedoch im Allgemeinen nicht die GetHashCode-Methode von Object oder ValueType auf, da die Implementierung beider nichts mit Hochleistungs-Hashing-Algorithmen zu tun hat
3. Die Ausführungsgeschwindigkeit des Algorithmus sollte so schnell wie möglich sein
4, mit demselben Wert. Verschiedene Objekte sollten denselben Hashwert zurückgeben. Beispielsweise geben zwei Zeichenfolgenobjekte, die denselben Text enthalten, denselben Hash-Code zurück
5. Die von System.Object implementierte GetHashCode-Methode weiß nichts über abgeleitete Typen und andere Felder und gibt daher eine garantiert unveränderte Zahl zurück.
ToString:
Der vollständige Name des Standardrückgabetyps (this.GetType().FullName)
GetType:
Gibt einen von abgeleiteten Typ zurück Typ Eine Instanz von Gibt den Typ des Objekts an, wenn GetType aufgerufen wird. Das zurückgegebene Type-Objekt kann mit Reflektionsklassen verwendet werden, um Metadateninformationen zum Objekttyp abzurufen. Darüber hinaus ist GetType eine nicht virtuelle Methode. Der Zweck besteht darin, zu verhindern, dass die Klasse die Methode überschreibt, den Unternehmenstyp verbirgt und dadurch die Typsicherheit zerstört.
Geschützte Methode:
MemberwiseClone:
Diese nicht-virtuelle Methode erstellt eine neue Instanz der Klasse und legt das Instanzfeld der fest statisches Objekt zu diesem Die Instanzfelder der Objekte sind genau gleich. Gibt einen Verweis auf die neue Instanz zurück.
Finalisieren:
Diese virtuelle Methode wird aufgerufen, nachdem der Garbage Collector feststellt, dass das Objekt als Müll recycelt wird, und bevor der Speicher des Objekts tatsächlich recycelt wird. Typen, die vor dem Recycling Aufräumarbeiten durchführen müssen, sollten diese Methode überschreiben.
Das obige ist der detaillierte Inhalt vonWas ist System.Object? Wie verwende ich System.Object?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!