Sobes.tech
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 null der 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)