Konstruktoren (C#-Programmierleitfaden)
Ein -Konstruktor ist eine Methode, die von der Laufzeit aufgerufen wird, wenn eine Instanz einer Klasse oder einer Struktur erstellt wird. Eine Klasse oder Struktur kann mehrere Konstruktoren haben, die unterschiedliche Argumente verwenden. Mit Konstruktoren können Sie sicherstellen, dass Instanzen des Typs bei der Erstellung gültig sind. Weitere Informationen und Beispiele finden Sie unter Instanzkonstruktoren und Verwenden von Konstruktoren.
Es gibt mehrere Aktionen, die Teil der Initialisierung einer neuen Instanz sind. Die folgenden Aktionen werden in der folgenden Reihenfolge ausgeführt:
- Instanzfelder werden auf 0 gesetzt. Diese Initialisierung wird normalerweise von der Laufzeitumgebung durchgeführt.
- Feldinitialisierungen laufen. Dies sind die Feldinitialisierer in der am häufigsten abgeleiteten Typausführung.
- Feldinitialisierungen vom Basistyp laufen. Dies ist der Feldinitialisierer, beginnend mit der direkten Basis über jeden Basistyp bis System.Object.
- Basisinstanz-Konstruktoren laufen. Alle Instanzkonstruktoren, beginnend mit Object.Object über jede Basisklasse bis zur direkten Basisklasse
- Der Instanzkonstruktor läuft. Der Instanzkonstruktor für den Typ wird ausgeführt.
- Objektinitialisierungen laufen. Wenn der Ausdruck Objektinitialisierungen enthält, werden diese nach dem Instanzkonstruktor ausgeführt. Objektinitialisierer werden in der Textreihenfolge ausgeführt.
Die vorangehenden Aktionen finden statt, wenn eine Instanz mit der Methode new
Betreiber. Wenn eine neue Instanz eines struct
auf den Wert default
festgelegt wird, werden alle Instanzfelder auf 0 gesetzt. Elemente eines Arrays werden auf den Standardwert 0 oder null
festgelegt, wenn ein Array erstellt wird.
Die statischer Konstruktor, (falls vorhanden) läuft, bevor eine der Aktionen des Instanzkonstruktors für eine Instanz des Typs stattfindet. Der statische Konstruktor wird höchstens einmal ausgeführt.
Konstruktorsyntax
Ein Konstruktor ist eine Methode mit demselben Namen wie ihr Typ. Seine Methodensignatur kann eine optionale Zugriffsmodifikator, den Namen der Methode und ihre Parameterliste; sie enthält keinen Rückgabetyp. Das folgende Beispiel zeigt den Konstruktor für eine Klasse mit dem Namen Person
.
public class Person
{
private string last;
private string first;
public Person(string lastName, string firstName)
{
last = lastName;
first = firstName;
}
// Remaining implementation of Person class.
}
Wenn ein Konstruktor in einer einzigen Anweisung implementiert werden kann, können Sie eine Ausdruck Körperglied. Im folgenden Beispiel wird eine Location
-Klasse definiert, deren Klassenkonstruktor einen einzelnen Zeichenfolgenparameter namens name enthält. Die Ausdruckstextdefinition weist das Argument dem Feld locationName
zu.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Wenn für einen Typ ein Parameter zum Erstellen einer Instanz erforderlich ist, können Sie einen primären Konstruktor verwenden, um anzugeben, dass mindestens ein Parameter erforderlich ist, um den Typ instanziieren zu können, wie im folgenden Beispiel gezeigt:
public class LabelledContainer<T>(string label)
{
public string Label { get; } = label;
public required T Contents
{
get;
init;
}
}
Statische Konstruktoren
Die vorherigen Beispiele zeigen Instanzkonstruktoren, die ein neues Objekt initialisieren. Eine Klasse oder Struktur kann auch einen statischen Konstruktor deklarieren, der statische Mitglieder des Typs initialisiert. Statische Konstruktoren sind parameterlos. Wenn Sie keinen statischen Konstruktor zum Initialisieren statischer Felder bereitstellen, initialisiert der C#-Compiler diese auf deren Standardwert, wie im Artikel Standardwerte von C#-Typen aufgeführt.
Im folgenden Beispiel wird ein statischer Konstruktor verwendet, um ein statisches Feld zu initialisieren.
public class Adult : Person
{
private static int minimumAge;
public Adult(string lastName, string firstName) : base(lastName, firstName)
{ }
static Adult() => minimumAge = 18;
// Remaining implementation of Adult class.
}
Sie können auch einen statischen Konstruktor mit einem Ausdruckskörper definieren, wie das folgende Beispiel zeigt.
public class Child : Person
{
private static int maximumAge;
public Child(string lastName, string firstName) : base(lastName, firstName)
{ }
static Child() => maximumAge = 18;
// Remaining implementation of Child class.
}
Weitere Informationen und Beispiele finden Sie unter Statische Konstruktoren.