Junior
Was ist der Unterschied zwischen Klassen und Strukturen in C#?
sobes.tech KI
Antwort von AI
Klassen sind Referenztypen, Strukturen sind Werttypen.
- Speicherort: Klasseninstanzen werden im verwalteten Heap platziert, Strukturen im Stack oder innerhalb des Objekts, dem sie angehören.
- Vererbung: Klassen unterstützen Vererbung, Strukturen nicht. Strukturen können Schnittstellen implementieren.
- Standardwert: Für Klassen ist
nullder Standardwert. Für Strukturen ist es eine Nullmenge für die Felder. - Übergabe an Methoden: Klasseninstanzen werden per Referenz übergeben (Referenz auf das Objekt). Strukturen werden per Wert übergeben (Kopie wird erstellt).
- Leistung: Strukturen können bei kleinen Objekten schneller sein als Klassen, da die Kosten für Heap-Verwaltung und Garbage Collection vermieden werden. Das Übergeben großer Strukturen per Wert kann jedoch weniger effizient sein.
- Erstellung: Für Strukturen initialisiert ein impliziter parameterloser Konstruktor die Felder mit Null. Für Klassen ist ein expliziter parameterloser Konstruktor erforderlich, wenn andere Konstruktoren definiert sind.
| Merkmal | Klasse (Class) | Struktur (Struct) |
|---|---|---|
| Typ | Referenztyp | Werttyp |
| Speicherort | Managed Heap | Stack / Intern |
| Vererbung | Unterstützt | Unterstützt nicht (aber implementiert Schnittstellen) |
| Standardwert | null |
Nullmenge |
| Übergabe | Per Referenz | Per Wert |
| Leistung | Kann bei kleinen Objekten langsamer sein | Kann bei kleinen Objekten schneller sein |
| Impliziter Konstruktor | Nein (wenn andere vorhanden) | Ja (Nullinitialisierung) |
// Klassenbeispiel
public class PointClass
{
public int X { get; set; }
public int Y { get; set; }
public PointClass(int x, int y)
{
X = x;
Y = y;
}
}
// Strukturbeispiel
public struct PointStruct
{
public int X { get; set; }
public int Y { get; set; }
public PointStruct(int x, int y)
{
X = x;
Y = y;
}
}
// Übergabe-Demonstration
public void ModifyPoint(PointClass pc, PointStruct ps)
{
pc.X = 100; // Ändert das ursprüngliche PointClass
ps.X = 100; // Ändert nur die Kopie von PointStruct
}
// Verwendung
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);
ModifyPoint(pointClass1, pointStruct1);
// pointClass1.X wird 100 sein
// pointStruct1.X wird 1 sein (da nur die Kopie geändert wurde)