3.3 Arbeiten mit Objektreferenzen 

3.3.1 Prüfen auf Initialisierung 

Mit
Circle kreis;
wird eine Objektvariable zwar deklariert, sie ist aber noch nicht initialisiert und hat auch nicht den Zustand null. Sehen wir uns nun an, was passiert, wenn wir eine Objektvariable deklarieren und anschließend ohne vorhergehende Initialisierung auf null testen.
class Program { static void Main(string[] args) { Circle kreis; if (kreis == null) { // die Variable kreis referenziert kein Objekt Console.WriteLine("Das Objekt existiert nicht!"); kreis = new Circle(); } else // kreis ist eine gültige Objektreferenz Console.WriteLine("Das Objekt existiert"); // weitere Anweisungen Console.ReadLine(); } }
Der C#-Compiler ist intelligent genug, um zu erkennen, dass die Objektreferenz kreis vor der Prüfung im if-Statement zu keinem Zeitpunkt initialisiert worden ist, und bricht die Kompilierung mit einer Fehlermeldung ab.
Verwechseln Sie null nicht mit der Zahl 0. null gibt an, dass eine Variable zwar initialisiert ist, aber kein konkretes Objekt referenziert. Das wäre beispielsweise nach der Deklaration mit
Circle kreis = null;
oder
Circle kreis = new Circle();
der Fall. Eine Referenz kann nur benutzt werden, wenn sie auf ein konkretes Objekt verweist oder den Wert null hat.
Wenn Sie sich über den Zustand der Variablen im Unklaren sind, muss dieser, wie im folgenden Codefragment gezeigt, überprüft werden:
if(kreis == null) // die Variable obj referenziert kein konkretes Objekt else // obj ist ein gültiges Objekt
Ebenso gut können Sie auch mit
if(kreis != null) ...
prüfen, ob kreis ein gültiger Objektverweis ist. Liefert diese Bedingung true, kann eine Methode des Objekts aufgerufen oder eine Eigenschaft ausgewertet werden, ohne einen Laufzeitfehler zu riskieren.
3.3.2 Ein Objekt freigeben 

Objekte beanspruchen den Speicher. Sie sollten daher ein Objekt freigeben, wenn Sie es nicht mehr benötigen. Dazu weisen Sie der Objektvariablen null zu, wie im folgenden Codefragment zu sehen ist:
Circle kreis = new Circle(); ... kreis = null;
Nun steht Ihnen das Objekt kreis nicht mehr zur Verfügung. Allerdings ist die Annahme falsch, dass das Objekt nun auch im Speicher gelöscht ist. Tatsächlich existiert es dort weiter, Sie können es nur nicht mehr aus dem Code heraus ansprechen. Zu einem späteren Zeitpunkt wird ein Mechanismus, die Garbage Collection, alle nicht mehr referenzierten Objekte im Speicher erfassen und deren beanspruchten Speicherplatz wieder freigeben. So wird es auch dem Objekt kreis ergehen. Auf die Garbage Collection kommen wir in Kapitel 4, »Vererbung, Polymorphie und Interfaces«, noch detailliert zu sprechen.
3.3.3 Mehrere Referenzen auf ein Objekt 

Es kommt immer wieder vor, dass mehrere Referenzen auf dasselbe Objekt zeigen. Betrachten Sie dazu das folgende Codefragment:
Circle kreis1 = new Circle(); Circle kreis2 = kreis1;
Zuerst wird die Variable kreis1 vom Typ Circle deklariert und initialisiert. Anschließend wird kreis1 der Variablen kreis2 zugewiesen. Trotz zweier namentlich unterschiedlicher Referenzen liegt nur ein konkretes Objekt vor, das sowohl über kreis1 als auch über kreis2 angesprochen werden kann.
Wenn Sie einem Feld über eine der beiden Referenzen einen Wert zuweisen, beispielsweise mit
kreis1.Radius = 10
können Sie mit der zweiten Objektreferenz den Inhalt der Eigenschaft auswerten:
Console.WriteLine(kreis2.Radius)
An der Konsole wird »10« angezeigt, da die Referenz kreis2 auf dasselbe Objekt zeigt wie die Referenz kreis1. Wird ein Objekt mehrfach referenziert, spielt es demnach keine Rolle, über welche Referenz der Eigenschaft ein Wert zugewiesen bzw. ein Feld ausgelesen wird – die Operation wird auf demselben Objekt ausgeführt.
Eine mehrfache Referenzierung hat noch weitere Konsequenzen: Geben Sie eine der Referenzen mit null frei, können Sie über die zweite Referenz das Objekt immer noch ansprechen, zum Beispiel:
Circle kreis1 = new Circle(); Circle kreis2; kreis2 = kreis1; kreis2.Radius = 20; kreis2 = null; Console.WriteLine(kreis1.Radius);
An der Konsole wird immer noch der Inhalt der Eigenschaft Radius ausgegeben. Erst mit der Freigabe der letzten gültigen Referenz auf ein Objekt wird dieses tatsächlich unwiederbringlich freigegeben.