Konstruktorverkettung mit this
Verwenden Sie die Initialisierungslogik in mehreren Konstruktoren wieder.
Konstruktorverkettung mit this ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Konstruktoren verketten?
Wenn mehrere Konstruktoren dieselbe Einrichtungslogik benötigen, können Sie sie verketten, sodass einer den anderen aufruft. Dadurch vermeiden Sie duplizierten Code und bündeln die Initialisierung an einer Stelle.
using System;
class Box
{
public int Width;
public int Height;
public Box(int width, int height)
{
Width = width;
Height = height;
}
public Box() : this(1, 1) { }
}
class Program
{
static void Main()
{
var def = new Box();
Console.WriteLine(def.Width + "x" + def.Height);
}
}Die : this(...)-Syntax
Zum Verketten verwenden Sie : this(args) nach der Konstruktorsignatur. Der Zielkonstruktor wird zuerst ausgeführt, danach läuft der aktuelle Konstruktorblock.
using System;
class Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
Console.WriteLine("Full constructor ran");
}
public Person(string name) : this(name, 0)
{
Console.WriteLine("Name-only constructor ran");
}
}
class Program
{
static void Main()
{
var p = new Person("Sam");
Console.WriteLine(p.Name + ", " + p.Age);
}
}Ausführungsreihenfolge
Der verkettete Konstruktor wird vor dem Körper des aufrufenden Konstruktors ausgeführt. Dadurch wird garantiert, dass die grundlegende Einrichtung zuerst erfolgt.
using System;
class Step
{
public Step(int n)
{
Console.WriteLine("Init with " + n);
}
public Step() : this(0)
{
Console.WriteLine("Then default body");
}
}
class Program
{
static void Main()
{
var s = new Step();
}
}Eine einzige Quelle der Wahrheit
Leiten Sie alle Konstruktoren an einen „primären“ Konstruktor weiter, der die eigentliche Logik enthält. Die übrigen Konstruktoren stellen nur Standardwerte bereit und verketten sich mit ihm.
using System;
class Connection
{
public string Host;
public int Port;
public Connection(string host, int port)
{
Host = host;
Port = port;
}
public Connection(string host) : this(host, 8080) { }
public Connection() : this("localhost", 8080) { }
}
class Program
{
static void Main()
{
var c = new Connection("example.com");
Console.WriteLine(c.Host + ":" + c.Port);
}
}Verketten mit Standardwerten
Das Verketten ist eine übersichtliche Möglichkeit, abgestufte Standardwerte auszudrücken: Jeder kürzere Konstruktor ergänzt einen weiteren Standardwert und delegiert die weitere Verarbeitung.
using System;
class Coffee
{
public string Size;
public bool Milk;
public int Sugar;
public Coffee(string size, bool milk, int sugar)
{
Size = size;
Milk = milk;
Sugar = sugar;
}
public Coffee(string size, bool milk) : this(size, milk, 0) { }
public Coffee(string size) : this(size, false) { }
}
class Program
{
static void Main()
{
var c = new Coffee("large");
Console.WriteLine(c.Size + ", milk=" + c.Milk + ", sugar=" + c.Sugar);
}
}Validierung im Zielkonstruktor
Da jeder Konstruktor über den primären Konstruktor geleitet wird, schützt die dort implementierte Validierung alle Erstellungspfade.
using System;
class Rect
{
public int W;
public int H;
public Rect(int w, int h)
{
if (w <= 0 || h <= 0)
throw new ArgumentException("Dimensions must be positive");
W = w;
H = h;
}
public Rect(int side) : this(side, side) { }
}
class Program
{
static void Main()
{
var square = new Rect(5);
Console.WriteLine(square.W + "x" + square.H);
}
}Verketten oder Standardparameter
Standardparameter können viele Überladungen ersetzen. Das Verketten ist jedoch übersichtlicher, wenn jeder Konstruktor in seinem Körper eine etwas andere Logik benötigt.
using System;
class Logger
{
public string Prefix;
public bool Verbose;
public Logger(string prefix, bool verbose)
{
Prefix = prefix;
Verbose = verbose;
}
public Logger(string prefix) : this(prefix, false)
{
Console.WriteLine("Created quiet logger");
}
}
class Program
{
static void Main()
{
var log = new Logger("APP");
Console.WriteLine(log.Prefix + " verbose=" + log.Verbose);
}
}Leere Konstruktorblöcke sind üblich
Ein Konstruktor, der nur weiterleitet, hat oft einen leeren Körper { }, weil die gesamte Arbeit im Zielkonstruktor erfolgt.
using System;
class Vector
{
public double X, Y, Z;
public Vector(double x, double y, double z)
{
X = x; Y = y; Z = z;
}
public Vector(double v) : this(v, v, v) { }
}
class Program
{
static void Main()
{
var v = new Vector(2);
Console.WriteLine(v.X + "," + v.Y + "," + v.Z);
}
}Zyklen vermeiden
Konstruktoren dürfen sich nicht in einer Schleife verketten (A ruft B auf, B ruft A auf). Der Compiler lehnt zirkuläre : this(...)-Ketten ab.
using System;
class Safe
{
public int A, B;
public Safe(int a, int b)
{
A = a;
B = b;
}
public Safe(int a) : this(a, 0) { } // chains one direction only
}
class Program
{
static void Main()
{
var s = new Safe(7);
Console.WriteLine(s.A + ", " + s.B);
}
}Mit this.field kombinieren
Sie können Konstruktoren verketten und im Körper weiterhin this. für zusätzliche Einrichtung verwenden, die nach der Rückkehr des Zielkonstruktors erfolgt.
using System;
class Account
{
public string Owner;
public decimal Balance;
public bool Active;
public Account(string owner, decimal balance)
{
this.Owner = owner;
this.Balance = balance;
}
public Account(string owner) : this(owner, 0m)
{
this.Active = true;
}
}
class Program
{
static void Main()
{
var a = new Account("Rin");
Console.WriteLine(a.Owner + " active=" + a.Active);
}
}Alles zusammenführen
Durch das Verketten bleibt eine Klasse DRY: Ein Konstruktor validiert und weist Werte zu, während die übrigen bequeme Abkürzungen bereitstellen.
using System;
class Pizza
{
public string Size;
public int Toppings;
public Pizza(string size, int toppings)
{
if (toppings < 0) throw new ArgumentException("toppings");
Size = size;
Toppings = toppings;
}
public Pizza(string size) : this(size, 0) { }
public Pizza() : this("medium") { }
}
class Program
{
static void Main()
{
var p = new Pizza();
Console.WriteLine(p.Size + " with " + p.Toppings + " toppings");
}
}Schnelltest
Testen Sie Ihr Verständnis der Konstruktorverkettung.
Zusammenfassung
Bei der Konstruktorverkettung wird mit : this(args) ein anderer Konstruktor derselben Klasse aufgerufen. Der Zielkonstruktor wird zuerst ausgeführt, danach der aktuelle Konstruktorblock. Leiten Sie jeden Konstruktor über einen primären Konstruktor, um die Validierung zu zentralisieren und doppelte Einrichtung zu vermeiden. Zirkuläre Ketten sind nicht zulässig.
using System;
class Demo
{
public int X, Y;
public Demo(int x, int y) { X = x; Y = y; }
public Demo(int both) : this(both, both) { }
}
class Program
{
static void Main()
{
var d = new Demo(4);
Console.WriteLine(d.X + "," + d.Y);
}
}Häufig gestellte Fragen
Ist die Lektion „Konstruktorverkettung mit this“ kostenlos?
Ja — der vollständige Text von „Konstruktorverkettung mit this“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Konstruktorverkettung mit this“?
Verwenden Sie die Initialisierungslogik in mehreren Konstruktoren wieder. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Konstruktorverkettung mit this“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Konstruktoren definieren
- Konstruktorverkettung mit this
- Objekt- und Collection-Initialisierer
- Statische Konstruktoren