Galileo Computing - Zum Seitenanfang

3.3 Arbeiten mit Objektreferenzen Zur nächsten ÜberschriftZur vorigen Überschrift


Galileo Computing - Zum Seitenanfang

3.3.1 Prüfen auf Initialisierung Zur nächsten ÜberschriftZur vorigen Überschrift

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.


Galileo Computing - Zum Seitenanfang

3.3.2 Ein Objekt freigeben Zur nächsten ÜberschriftZur vorigen Überschrift

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.


Galileo Computing - Zum Seitenanfang

3.3.3 Mehrere Referenzen auf ein Objekt topZur vorigen Überschrift

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);