Einleitung: Warum die Frage zu Auto-Eigenschaften tausende Aufrufe sammelte?
\n\nWenn Sie jemals in C# programmiert haben, sind Sie sicherlich auf eine einfache, aber wichtige Frage gestoßen: "Wie weist man einer Auto-Eigenschaft korrekt einen Anfangswert zu?". Diese Frage auf Stack Overflow hat zehntausende Aufrufe gesammelt, und das zu Recht. Die scheinbare Einfachheit verbirgt viele Fallstricke.
\n\nStellen Sie sich vor: Sie erstellen eine Klasse User und möchten, dass die Eigenschaft Name standardmäßig nicht null, sondern ein leerer String ist. Was könnte da schon schiefgehen? In der Praxis machen Entwickler jedoch typische Fehler bei der Initialisierung von C# Eigenschaften, die zu NullReferenceException oder unerwartetem Verhalten führen.
In diesem Artikel analysieren wir die TOP-5 Fehler und zeigen, wie Sie diese vermeiden. Sie lernen moderne Ansätze kennen – von C# 6 bis C# 12 – und verstehen, welche Methode Sie für Ihr Projekt wählen sollten.
\n\n\n\n
Fehler Nr. 1: Ignorieren der Initialisierung von Auto-Eigenschaften
\n\nDer häufigste Fehler ist es, keinen Anfangswert für Referenztypen zu setzen. Viele Anfänger schreiben:
\n\npublic class User\n{\n public string Name { get; set; } // null standardmäßig\n public List<string> Roles { get; set; } // null\n}\n\nIn C# sind Auto-Eigenschaften für Referenztypen standardmäßig null. Dies führt zu Problemen mit NullReferenceException, wenn Sie vergessen, vor der Verwendung einen Wert zuzuweisen.
Wie beheben?
\nWeisen Sie immer explizit einen Initialisierer für Auto-Eigenschaften in C# zu. Der einfachste Weg ist die Verwendung der C# 6 Syntax:
\n\npublic class User\n{\n public string Name { get; set; } = string.Empty;\n public List<string> Roles { get; set; } = new List<string>();\n}\n\n\n\n\nTipp: Verwenden Sie
\nstring.Emptyanstelle von leeren Anführungszeichen – das verbessert die Lesbarkeit und entspricht den Best Practices in C#.
\n\n
Fehler Nr. 2: Initialisierung im Konstruktor ohne Berücksichtigung der Aufrufkette
\n\nEin weiterer häufiger Fehler ist das Setzen des Standardwerts in C# nur im Konstruktor, während die Initialisierer der Eigenschaften ignoriert werden. Dies kann zu Verwirrung führen, insbesondere bei Vererbung.
\n\npublic class BaseClass\n{\n public int Value { get; set; }\n\n public BaseClass()\n {\n Value = 10;\n }\n}\n\npublic class DerivedClass : BaseClass\n{\n public DerivedClass()\n {\n // Value ist bereits = 10, aber wir können überschreiben\n }\n}\n\nProblem: Wenn Sie einen Initialisierer für die Eigenschaft Value hinzufügen und die Zuweisung im Konstruktor belassen, kann die Ausführungsreihenfolge Sie überraschen. Initialisierer werden vor dem Rumpf des Basisklassenkonstruktors ausgeführt, aber nach dem Aufruf des Konstruktors der abgeleiteten Klasse.
Wie vermeiden?
\nWählen Sie eine Methode: entweder Initialisierer oder Konstruktor. Bevorzugen Sie Initialisierer für Auto-Eigenschaften in C#, da sie vorhersehbarer und prägnanter sind.
\n\npublic class BaseClass\n{\n public int Value { get; set; } = 10; // Einheitliche Quelle der Wahrheit\n}\n\n\n\n
Fehler Nr. 3: Verwendung von readonly-Feldern anstelle von Auto-Eigenschaften
\n\nEinige Entwickler verzichten beim Versuch, einen Anfangswert zu setzen, auf Auto-Eigenschaften und verwenden öffentliche Felder:
\n\npublic class Config\n{\n public readonly int MaxRetries = 3; // Fehler: Verletzung der Kapselung\n}\n\nDies ist eine schlechte Praxis. Felder verletzen die Kapselung – Sie können keine Logik in den Getter/Setter einfügen, ohne die API zu ändern. Außerdem führt dies bei Serialisierung oder Verwendung in WPF/Blazor zu Problemen.
\n\nDer richtige Ansatz
\nVerwenden Sie Auto-Eigenschaften mit Initialisierung oder init-only Eigenschaften in C# 9:<