1. Einführung
Struktur – das ist ein spezieller Datentyp in C#, mit dem du mehrere Werte (auch von verschiedenen Typen) in eine „Box“ packen kannst. Das ist wie ein kleiner LEGO-Baukasten: Du steckst Teile zusammen und bekommst am Ende ein praktisches, kompaktes Objekt.
Strukturen sind ähnlich wie Klassen, aber sie haben ihre Eigenheiten und werden für „einfachere“ Fälle genutzt, wenn du nicht die ganze Power und „Schwere“ von Klassen brauchst.
Syntax
struct Point
{
public int X;
public int Y;
}
In diesem Beispiel haben wir eine Struktur für einen Punkt auf der Ebene mit den Koordinaten X und Y beschrieben.
Wo werden Strukturen verwendet?
Meistens nutzt man Strukturen für kleine, einfache Objekte, die richtig leicht und „nur Daten“ sein sollen.
In C# sind einige Standardtypen Strukturen:
- int, double, bool, DateTime, TimeSpan, decimal, Guid
- und sogar zum Beispiel ConsoleKeyInfo oder Point (in Grafikbibliotheken)
Unterschiede zwischen Strukturen und Klassen
| Kriterium | Struktur | Klasse |
|---|---|---|
| Schlüsselwort | |
|
| Speichertyp | Value Type | Reference Type |
| Wird gespeichert im | Stack (Speicherbereich) | Heap (Speicherbereich) |
| Übergabe an Methode | Per Wert (Kopie) | Per Referenz |
| Vererbung | Nein (außer Interfaces) | Ja |
| Kann null sein | Nein (nur Nullable) | Ja |
| Standardmäßig | Implizite Initialisierung aller Felder mit Nullen | Nur über Konstruktor |
2. Deklaration und Verwendung von Strukturen
Du kannst eine Struktur innerhalb oder außerhalb einer Klasse deklarieren:
struct Rectangle
{
public int Width;
public int Height;
}
Erstellen und verwenden:
Rectangle r;
r.Width = 10;
r.Height = 5;
Console.WriteLine($"Fläche: {r.Width * r.Height}");
Du kannst auch einen Konstruktor verwenden:
struct Point
{
public int X;
public int Y;
// Konstruktor
public Point(int x, int y)
{
X = x;
Y = y;
}
}
var p = new Point(3, 7);
Console.WriteLine($"Punkt: ({p.X}, {p.Y})");
Wann solltest du eine Struktur verwenden?
- Für kleine „Datenpakete“ (zum Beispiel Koordinate, Farbe, Bereich, Datum und Uhrzeit).
- Wenn Kompaktheit und Performance wichtig sind (zum Beispiel Millionen von Punkten in einem Array).
- Wenn das Objekt sich wie ein einzelner Wert verhalten soll (copy-paste – es wird wirklich eine Kopie gemacht!).
Du solltest keine Struktur verwenden, wenn das Objekt:
- Groß werden kann (viele Felder).
- An einer Vererbungshierarchie teilnehmen soll.
- Oft per Referenz geändert werden muss.
3. Besonderheiten und „Fallen“ von Strukturen
Kopieren
Point p1 = new Point(1, 2);
Point p2 = p1; // es wird eine KOPIE erstellt!
p2.X = 100;
Console.WriteLine(p1.X); // 1 – hat sich nicht geändert!
Console.WriteLine(p2.X); // 100
Implizite Standardwerte
Point p; // Felder X und Y = 0, auch wenn du nichts explizit zuweist!
Kann Nullable sein
Um null speichern zu können, musst du spezielle Nullable-Syntax verwenden – einfach ein Fragezeichen nach dem Typnamen. Dann kannst du der Variable null zuweisen.
Point? p = null;
if (p == null)
Console.WriteLine("Kein Punkt");
4. Strukturen mit automatischen Properties und Methoden
Strukturen können Methoden, Properties, Events und sogar statische Members haben.
public struct Range
{
public int Start { get; set; }
public int End { get; set; }
public int Length => End - Start;
public override string ToString() => $"[{Start}..{End}]";
}
Beispiel: Struktur für komplexe Zahlen
Struktur für komplexe Zahlen mit Methode und Override von ToString()
struct Complex
{
public double Re;
public double Im;
public Complex(double re, double im)
{
Re = re;
Im = im;
}
public double Abs() => Math.Sqrt(Re * Re + Im * Im);
public override string ToString() => $"{Re} + {Im}i";
}
var z = new Complex(1, 2);
Console.WriteLine(z); // 1 + 2i
Console.WriteLine(z.Abs()); // 2.236...
GO TO FULL VERSION