← SEARCHABLE ARCHIVE
C# · 2026-07-21

C# von den Grundlagen bis zum Profi — Folge 3

Klassen, Strukturen, Datensätze und Nullsicherheit verstehen

INTERACTIVE READING MODE →

Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.

In C# können Daten als Klasse, Struktur und Datensatz ausgedrückt werden. Auch wenn die Grammatik ähnlich ist, sind die Kopiermethode und die Bedeutung der Identität unterschiedlich und müssen daher entsprechend dem Zweck ausgewählt werden.

Klasse ist ein Referenztyp

public sealed class Player
{
    public string Name { get; }
    public int Health { get; private set; }

    public Player(string name, int health)
    {
        Name = name;
        Health = health;
    }
}

Player first = new("Rose", 100);
Player second = first;

Im zweiten Fall werden Verweise, die auf dasselbe Objekt verweisen, kopiert, nicht das gesamte Objekt. Wenn Sie die Gesundheit auf einer Seite ändern, können Sie die geänderten Ergebnisse auf der anderen Seite sehen.

struct ist ein Werttyp

public readonly struct Position
{
    public float X { get; }
    public float Y { get; }

    public Position(float x, float y)
    {
        X = x;
        Y = y;
    }
}

Wenn Sie eine Struktur zuweisen, wird der Wert kopiert. Es eignet sich für kleine Daten, die als einzelner Wert behandelt werden, z. B. Koordinaten oder Farben.

Große Strukturen verursachen höhere Kopierkosten und veränderliche Strukturen können zu unvorhersehbarem Verhalten führen. Eine Struktur ist nicht unbedingt schnell.

record vergleicht die Werte selbst

public sealed record ItemKey(int Id, string Grade);

var a = new ItemKey(10, "Rare");
var b = new ItemKey(10, "Rare");

Console.WriteLine(a == b); // True

Allgemeine Klassen vergleichen grundsätzlich, ob Referenzen gleich sind, aber Datensätze vergleichen, ob die Konfigurationswerte gleich sind. Es eignet sich gut für die Verwendung mit unveränderlichen Daten wie Einstellungen, Befehlen und Netzwerknachrichten.

Markieren Sie den Typ als nullfähig

Player? FindPlayer(int id)
{
    return players.TryGetValue(id, out Player? player)
        ? player
        : null;
}

Player? target = FindPlayer(10);
if (target is not null)
{
    Console.WriteLine(target.Name);
}

Mithilfe eines Nullable-Referenztyps können Sie zwischen Nullable- und Nicht-Nullable-Referenzen unterscheiden. Bevor Sie die Warnung mit ! löschen, müssen Sie den Ablauf erneut überprüfen, um festzustellen, ob Null wirklich unmöglich ist.

Die Wahl der Klasse, Struktur und des Datensatzes ist keine Frage der Präferenz. Sie müssen zunächst entscheiden, ob die Identität des Objekts wichtig ist, ob das Kopieren von Werten natürlich ist oder ob es sich um unveränderliche Daten handelt.