Jeder kann coden / Programmieren & TicTacToe / C# Einführung
Referenztypen und Werttypen in C#¶
![]() |
![]() |
Link zur Microsoft Dokumentation (Quelle) Link zum roten Faden auf Miro |
In C# werden Datentypen in zwei Kategorien unterteilt:
Werttypen:
- Enthalten die tatsächlichen Werte.
- Werden auf dem Stack gespeichert.
- Beispiele:
int
,float
,bool
,struct
.
Referenztypen:
- Enthalten einen Verweis (Referenz) auf den Speicherort, an dem die Daten tatsächlich gespeichert sind.
- Der eigentliche Wert wird auf dem Heap gespeichert, während die Referenz auf dem Stack gespeichert wird.
- Beispiele:
class
,string
,array
.
Stack und Heap¶
Stack:
- Schneller Speicherbereich, der für lokale Variablen und Methodenaufrufe verwendet wird.
- Organisiert als LIFO (Last In, First Out).
- Jede Methode hat ihren eigenen Stackrahmen (Stack Frame) für Parameter, Rückgabewerte und lokale Variablen.
Heap:
- Speicher für dynamisch erzeugte Objekte.
- Langsamer als der Stack, aber erlaubt flexiblere Speicherverwaltung.
- Referenzen auf Objekte im Heap werden auf dem Stack gespeichert.
Embedded miro board...
Übergabe von Parametern¶
Werttypen:
- Standardmäßig erfolgt die Übergabe per Wert. Es wird eine Kopie der Variablen erstellt, sodass Änderungen an der Kopie keinen Einfluss auf das Original haben.
Referenztypen:
- Der Verweis wird standardmäßig per Wert übergeben. Das bedeutet, dass zwar das Objekt selbst geändert werden kann, aber nicht die Referenz.
Übergabe per
ref
:- Übermittelt den tatsächlichen Speicherort der Variable (Stack oder Heap).
- Änderungen am Parameter beeinflussen die ursprüngliche Variable direkt.
Übergabe per
out
:- Ähnlich wie
ref
, jedoch muss die Variable vor der Verwendung initialisiert werden.
- Ähnlich wie
Zusammenarbeit von Stack und Heap¶
Wenn ein Referenztyp (z. B. ein Objekt) übergeben wird:
- Der Verweis auf das Objekt wird auf dem Stack gespeichert.
- Das Objekt selbst liegt auf dem Heap.
- Änderungen am Objekt über den Verweis wirken sich auf das Original aus.
Codebeispiele¶
1. Änderung eines Referenztyps¶
In [ ]:
using System;
class Program
{
class Person
{
public string Name { get; set; }
}
static void ChangeName(Person person)
{
person.Name = "Changed";
}
static void Main()
{
Person p = new Person { Name = "Original" };
Console.WriteLine($"Before: {p.Name}");
ChangeName(p);
Console.WriteLine($"After: {p.Name}");
}
}
Hier wird nur die Referenz (person
) übergeben. Änderungen am Objekt ändern den Zustand des ursprünglichen Objekts.
2. Wertänderung mit ref
¶
In [ ]:
using System;
class Program
{
static void ChangeValue(ref int x)
{
x = 100;
}
static void Main()
{
int value = 10;
Console.WriteLine($"Before: {value}");
ChangeValue(ref value);
Console.WriteLine($"After: {value}");
}
}
Mit ref
wird die tatsächliche Speicheradresse von value
übergeben. Änderungen innerhalb der Methode ändern den ursprünglichen Wert.
3. Referenzänderung mit ref
¶
In [ ]:
using System;
class Program
{
class Person
{
public string Name { get; set; }
}
static void ChangeReference(ref Person person)
{
person = new Person { Name = "New Person" };
}
static void Main()
{
Person p = new Person { Name = "Original" };
Console.WriteLine($"Before: {p.Name}");
ChangeReference(ref p);
Console.WriteLine($"After: {p.Name}");
}
}
Hier ändert ChangeReference
den Verweis selbst. Das ursprüngliche Objekt (p
) zeigt nach dem Methodenaufruf auf eine neue Instanz.
Fazit¶
- Werttypen speichern die Daten direkt und sind isoliert bei der Übergabe.
- Referenztypen speichern Verweise, Änderungen am Objekt über einen Verweis wirken sich auf das Original aus.
ref
erlaubt die Übergabe der tatsächlichen Adresse, was Änderungen am Originalwert oder Referenz ermöglicht.