Wird geladen...

Structs in C# – Unterschiede zu Klassen

Erfahren Sie die Unterschiede zwischen Structs und Klassen in C# in Bezug auf Speicher, Vererbung und Performance.

In C# sind class (Klasse) und struct (Struktur) zwei grundlegende Typen, die Daten und Verhalten zusammenführen. Auch wenn sie auf den ersten Blick ähnlich erscheinen, gibt es wichtige Unterschiede bei der Speicherverwaltung und den Anwendungszwecken. class-Typen verhalten sich als Referenztypen, während struct-Typen Werttypen sind.


Was ist ein Struct?

Ein struct wird in der Regel verwendet, um kleine, kurzlebige und einfache Datensätze darzustellen. Geeignet sind z. B. ein 2D-Koordinatenpunkt oder ein Datumsbereich. Standardmäßig ist es ein Werttyp, d. h. beim Kopieren wird eine neue, unabhängige Kopie erstellt.


public struct Point
{
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }

    public void Print()
    {
        Console.WriteLine($"({X}, {Y})");
    }
}

Unterschiede zwischen Struct und Class

Die wichtigsten Unterschiede zwischen struct und class sind:


Kopierverhalten

Wenn Strukturen kopiert werden, entsteht eine völlig neue Kopie. Bei Klassen wird nur die Referenz weitergegeben, und beide Variablen zeigen auf dasselbe Objekt.


Point p1 = new Point(10, 20);
Point p2 = p1; // kopiert
p2.X = 99;

Console.WriteLine(p1.X); // 10 (unabhängige Kopie)
Console.WriteLine(p2.X); // 99

class Person
{
    public string Name { get; set; }
}

var p1 = new Person { Name = "John" };
var p2 = p1; // gleiche Referenz
p2.Name = "Michael";

Console.WriteLine(p1.Name); // "Michael"
Console.WriteLine(p2.Name); // "Michael"

Referenztypen und Werttypen

In C# werden Typen grundsätzlich in Werttypen und Referenztypen eingeteilt. Ein struct ist ein Werttyp; beim Zuweisen oder als Methodenparameter werden alle Daten kopiert. Änderungen an einer Kopie beeinflussen die andere nicht. Eine class ist ein Referenztyp; beim Zuweisen wird eine Referenz auf dasselbe Objekt im Speicher kopiert. Daher sind Änderungen über eine Referenz auch in anderen Referenzen sichtbar.


// Werttyp (struct)
Point p1 = new Point(1, 2);
Point p2 = p1;   // Kopie
p2.X = 99;
Console.WriteLine(p1.X); // 1
Console.WriteLine(p2.X); // 99

// Referenztyp (class)
Person a = new Person { Name = "Alice" };
Person b = a;    // gleiches Objekt
b.Name = "Maria";
Console.WriteLine(a.Name); // Maria
Console.WriteLine(b.Name); // Maria

Wann Struct, wann Class?

Verwenden Sie struct für kleine, unveränderliche (immutable) und begrenzte Datentypen. class eignet sich besser für große, komplexe Objekte mit längerer Lebensdauer und wenn Vererbung erforderlich ist. Beispiele: 3D-Punkte, Farbwerte, Datumsbereiche → struct; Kunde, Produkt, Bestellung → class.


Beispiel: Berechnung mit Struct


public struct Point2D
{
    public int X { get; }
    public int Y { get; }

    public Point2D(int x, int y)
    {
        X = x;
        Y = y;
    }

    public double DistanceTo(Point2D other)
    {
        int dx = X - other.X;
        int dy = Y - other.Y;
        return Math.Sqrt(dx * dx + dy * dy);
    }
}

class Program
{
    static void Main()
    {
        var p1 = new Point2D(0, 0);
        var p2 = new Point2D(3, 4);

        Console.WriteLine(p1.DistanceTo(p2)); // 5
    }
}

TL;DR

  • struct = Werttyp, class = Referenztyp.
  • Structs eignen sich für kleine und einfache Datensätze; Klassen für komplexe Objekte.
  • Beim Kopieren eines Structs entsteht eine unabhängige Kopie; bei einer Klasse nur eine Referenz auf dasselbe Objekt.
  • Structs können nicht erben, aber Interfaces implementieren; Klassen können erben.
  • Structs sind standardmäßig nicht null; Klassen können null sein.