Kapitel 18 - Referenz- vs. Werttypen
Heute lerne ich etwas sehr Zentrales, das für objektorientiertes Programmieren absolut wichtig ist: Ich verstehe, warum ein int sich anders verhält als ein Objekt wie Spieler, wenn ich es z.B. einer anderen Variable zuweise. Ich lerne den Unterschied zwischen Werttypen und Referenztypen und was das für Kopieren, Veränderung und Vergleich bedeutet.
Was sind Werttypen?
Beispiele für Werttypen:
- int, double, bool, char, decimal
- alle "einfachen" Datentypen
Werttypen speichern ihren eigentlichen Wert direkt in der Variable.
Beispiel:
Hier wurde der Wert von a kopiert - danach sind a und b völlig unabhängig.
Was sind Referenztypen?
Beispiele für Referenztypen:
- eigene Klassen wie Spieler, Auto, Produkt
- auch: Arrays, Strings, Listen
Beispiel:
Spieler s1 = new Spieler();
s1.Name = "Nico";
Spieler s2 = s1;
s2.Name = "Gustav";
Console.WriteLine(s1.Name); // Ausgabe: Gustav!
Warum? - Weil s1 und s2 auf dasselbe Objekt zeigen. Sie verweisen beide auf den gleichen Speicherplatz.
So funktioniert es im Hintergrund:
- s1 zeigt auf ein Objekt im Speicher (z.B. bei Adresse 0x01A4)
- Wenn ich s2 = s1 mache, zeigt s2 auf dieselbe Adresse
- Es gibt also nur ein Objekt, aber zwei Namen, die darauf zeigen
Klassischer Fehler beim Kopieren
Ich denke vielleicht:
Aber in Wirklichkeit bedeutet das: kopie zeigt auf das selbe Objekt - Änderungen wirken sich auf beide aus.
Wenn ich ein echtes Duplikat möchte?
Dann muss ich das Objekt aktiv kopieren - z.B. per Methode:
Jetzt habe ich zwei unabhängige Objekte mit identischen Werten.
Zusammenfassung
| Typ | Verhalten bei Zuweisung |
| int, bool | Es wird der Wert kopiert |
| Spieler | Es wird die Referenz kopiert (beide zeigen auf dasselbe Objekt) |
Vergleich aus dem Alltag
| Werttyp | Referenztyp |
| Fotokopie eines Dokuments | Zwei Leute lesen dasselbe Blatt |
| Jeder hat seine eigene Kopie | Beide zeigen auf dasselbe Original |
Merksätze:
Werttypen enthalten den Wert selbst
- Referenztypen enthalten nur einen Verweis auf das Objekt
- Bei Spieler b = a; sind a und b verbunden - sie meinen dasselbe Objekt
- Wenn ich wirklich eine Kopie will, muss ich ein neues Objekt erzeugen