Initialisierung von Auto-Eigenschaften in C#: TOP-5 Fehler und Meisterkurs

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum die Frage zu Auto-Eigenschaften tausende Aufrufe sammelte?

\n\n

Wenn 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\n

Stellen 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.

\n\n

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\n

Der häufigste Fehler ist es, keinen Anfangswert für Referenztypen zu setzen. Viele Anfänger schreiben:

\n\n
public class User\n{\n    public string Name { get; set; } // null standardmäßig\n    public List<string> Roles { get; set; } // null\n}
\n\n

In 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.

\n\n

Wie beheben?

\n

Weisen Sie immer explizit einen Initialisierer für Auto-Eigenschaften in C# zu. Der einfachste Weg ist die Verwendung der C# 6 Syntax:

\n\n
public 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

Tipp: Verwenden Sie string.Empty anstelle von leeren Anführungszeichen – das verbessert die Lesbarkeit und entspricht den Best Practices in C#.

\n
\n\n
\n\n

Fehler Nr. 2: Initialisierung im Konstruktor ohne Berücksichtigung der Aufrufkette

\n\n

Ein 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\n
public 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\n

Problem: 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.

\n\n

Wie vermeiden?

\n

Wä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\n
public 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\n

Einige Entwickler verzichten beim Versuch, einen Anfangswert zu setzen, auf Auto-Eigenschaften und verwenden öffentliche Felder:

\n\n
public class Config\n{\n    public readonly int MaxRetries = 3; // Fehler: Verletzung der Kapselung\n}
\n\n

Dies 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\n

Der richtige Ansatz

\n

Verwenden Sie Auto-Eigenschaften mit Initialisierung oder init-only Eigenschaften in C# 9:<

Blogs

Buchempfehlungen