Wie man einen Konstruktor von einem anderen in C# aufruft: Einfache Lösungen

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

Warum das wichtig ist: Ein Konstruktor ist gut, zwei sind besser

\n\n

Haben Sie jemals eine Klasse in C# geschrieben und bemerkt, dass Sie mehrere Konstruktoren haben, die fast dasselbe tun? Zum Beispiel einer, der Name und Alter annimmt, ein anderer nur den Namen, ein dritter gar nichts. Anstatt denselben Code in jeden Konstruktor zu kopieren, bietet C# eine elegante Lösung: einen Konstruktor von einem anderen aufrufen. Das spart nicht nur Zeit – es macht den Code sauberer, verständlicher und leichter wartbar. Heute analysieren wir dieses Thema anhand realer Beispiele, als ob Sie gerade auf eine häufig gestellte Frage auf Stack Overflow gestoßen wären. Los geht's!

\n\n

Wie der Aufruf eines Konstruktors von einem anderen in C# funktioniert

\n\n

In C# können Sie einen Konstruktor von einem anderen mit den Schlüsselwörtern this und base aufrufen. Dies wird als "Konstruktorkette" (constructor chaining) bezeichnet. Lassen Sie uns beide Varianten durchgehen.

\n\n

1. Das Schlüsselwort this – Aufruf eines Konstruktors in derselben Klasse

\n\n

Wenn Sie mehrere Konstruktoren in einer Klasse haben, können Sie this verwenden, um die Steuerung an einen von ihnen zu übergeben. Dies ist besonders nützlich, wenn ein Konstruktor eine "Verallgemeinerung" eines anderen ist.

\n\n

Ein einfaches Beispiel: die Klasse Person, die Name und Alter speichert. Der Standardkonstruktor setzt Standardwerte, während der parametrisierte Konstruktor deren Überschreibung erlaubt.

\n\n
public class Person\n{\n    public string Name { get; set; }\n    public int Age { get; set; }\n\n    // Standardkonstruktor\n    public Person() : this("Gast", 18)\n    {\n        // Hier schreiben wir nichts – die Kette erledigt alles\n    }\n\n    // Konstruktor mit Parametern\n    public Person(string name, int age)\n    {\n        Name = name;\n        Age = age;\n    }\n}
\n\n

Der entscheidende Punkt in diesem Code ist : this("Gast", 18). Wenn Sie ein Objekt mit new Person() erstellen, wird der parameterlose Konstruktor aufgerufen, übergibt aber sofort die Steuerung an den Konstruktor mit zwei Parametern und übergibt ihm die Werte "Gast" und 18. Somit befindet sich die gesamte Initialisierungslogik an einer Stelle.

\n\n

2. Das Schlüsselwort base – Aufruf des Konstruktors der Basisklasse

\n\n

Wenn Ihre Klasse von einer anderen Klasse erbt, können Sie den Konstruktor der Basisklasse über base aufrufen. Dies stellt sicher, dass der Basisteil des Objekts korrekt initialisiert wird.

\n\n

Beispiel: Basisklasse Animal und abgeleitete Klasse Dog.

\n\n
public class Animal\n{\n    public string Species { get; set; }\n\n    public Animal(string species)\n    {\n        Species = species;\n    }\n}\n\npublic class Dog : Animal\n{\n    public string Breed { get; set; }\n\n    // Konstruktor von Dog ruft Konstruktor von Animal auf\n    public Dog(string breed) : base("Hund")\n    {\n        Breed = breed;\n    }\n}
\n\n

Hier sagt : base("Hund") dem Compiler: "Führe zuerst den Konstruktor der Basisklasse Animal mit dem Argument 'Hund' aus, und fahre dann mit der Initialisierung von Dog fort." Ohne dies würden Sie einen Kompilierungsfehler erhalten, da Animal keinen Standardkonstruktor hat.

\n\n

Reales Beispiel: Eine häufig gestellte Frage von Stack Overflow

\n\n

Stellen Sie sich vor, Sie arbeiten an einer Anwendung für einen Online-Shop. Sie haben eine Klasse Order, die auf verschiedene Weise erstellt werden kann: mit einer Kunden-ID, mit einem vollständigen Datensatz oder ganz ohne Parameter (für Tests).

\n\n
public class Order\n{\n    public int OrderId { get; set; }\n    public int CustomerId { get; set; }\n    public decimal TotalAmount { get; set; }\n    public DateTime CreatedDate { get; set; }\n\n    // Parameterloser Konstruktor – für Tests\n    public Order() : this(0, 0, 0)\n    {\n    }\n\n    // Konstruktor mit minimalen Daten\n    public Order(int customerId, decimal totalAmount) : this(0, customerId, totalAmount)\n                

Blogs

Buchempfehlungen