System.Object
Es ist wichtig die Basisklasse aller Klassen zu nennen:
System.Object. Delphi und C# leiten alle Klassen implizit von
Object ab. Es gibt vier wichtige Methoden von
Object welche genannt werden sollten:
Equals,
Finalize,
GetHashCode und
ToString.
System.Object.Equals(...)
The Methode
Equals wird genutzt, um zwei Objekte miteinander zu vergleichen. Diese Methode kann überschrieben werden, wenn man feststellen will, ob zwei Objekte identisch sind. Die Standardimplementierung liefert
true zurück, wenn die Referenzen zweier Objekte identisch sind. Anders ausgedrückt,
Equals überprüft nicht, ob die Werte identisch sind. Ausnahme zu dieser Regel sind Wertetypen, diese werden als identisch betrachtet, wenn deren Bits identisch sind.
System.Object.GetHashCode(...)
GetHashCode wird immer aufgerufen, wenn ein Objekt in eine Hashtabelle eingefügt wird. Allgemein: wenn man
GetHashCode überschreibt, dann sollte man auch immer
Equals überschreiben, ansonsten kann es zu Problemen bei der Nutzung in Hashtabellen kommen.
GetHashCode sollte immer sehr performant sein und einen Integerwert zurückliefern, welcher das Objekt (fast) eindeutig identifizieren kann. Kommt es bei den HashCode-Werten zu Kollisionen, so wird Equals aufgerufen, um zwei Objekte miteinander zu vergleichen; das ist auch der Grund, warum
Equals überschrieben werden sollte, wenn man
GetHashCode überschreibt..
System.Object.Finalize(...)
Finalize ist der Basis-Destructor für Objekte.
Finalize wird immer automatisch aufgerufen, wenn ein Objekt der Garbage-Collection hinzugefügt wird, außer man ruft explizit die Methode
SurpressFinalize(...) auf. In Delphi wird
Finalize durch
Destroy, in C# durch
~ClassName definiert. Da jede Sprache bereits ihre eigene Art hat die
Finalize Methode zu spezifizieren, erlauben diese es auch nicht
Finalize zu überschreiben.
Es gibt einige wichtige Punkte, welche bei
Finalize zu beachten sind. Erstens, man kann nicht vorhersagen wann die Methode aufgerufen wird. Wenn es wichtig ist, dass Resourcen wieder freigegeben werden, dann sollte man sich
NIE auf
Finalize/
Destroy verlassen. Stattdessen sollte man die Schnittstelle
IDisposable implementieren und die Resourcen in der
Dispose(...) Methode freigeben. Jeder, der das Objekt dann einsetzt sollte
Dispose aufrufen, um die Resourcen wieder freizugeben. Für den Fall, das es jemand vergessen sollte
Dispose aufzurufen, sollte man
Dispose auch aus
Finalize heraus aufrufen. Es ist aber sicher zu stellen, dass
Dispose nicht bereits ausgeführt wurde. Das sichert einen dagegen ab Resourcen ausversehen auf Dauer zu belegen.
System.Object.ToString(...)
Eine sehr praktische Methode aller Objekte ist
ToString. Diese Methode ermöglicht es jedem Objekt sich als String zu repräsentieren. Es ist z.B. sehr praktisch, um Integerwerte als Strings darzustellen; einfach
.ToString(...) ans Ende anfügen und schon hat man die Stringdarstellung eines Integers.
Für eigene Objekt kann es sinnvoll sein
ToString zu überschreiben und damit eine gute Darstellung des Objektes als String zu erzielen.