Freigeben über


Verwenden von Konstruktoren (C#-Programmierhandbuch)

Beim Instanziieren einer class oder struct ruft die Runtime deren Konstruktor auf. Konstruktoren haben denselben Namen wie die Klasse oder Struktur und initialisieren in der Regel die Datenmitglieder des neuen Objekts.

Im folgenden Beispiel wird eine Klasse mit dem Namen Taxi mithilfe eines einfachen Konstruktors definiert. Diese Klasse wird dann mit dem new-Operator instanziiert. Die Laufzeit ruft den Taxi-Konstruktor unmittelbar nach der Zuweisung des Speichers für das neue Objekt auf.

public class Taxi
{
    private string taxiTag;

    public Taxi(string tag) => taxiTag = tag;

    public override string ToString() => $"Taxi: {taxiTag}";
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi("Tag1345");
        Console.WriteLine(t);
    }
}

Ein Konstruktor, der keine Parameter akzeptiert, wird parameterloser Konstruktor genannt. Die Laufzeit ruft den parameterlosen Konstruktor auf, wenn ein Objekt mithilfe des new-Operators instanziiert wird und keine Argumente für newbereitgestellt werden. Mit C# 12 wurden primäre Konstruktoren eingeführt. Ein primärer Konstruktor gibt Parameter an, die bereitgestellt werden müssen, um ein neues Objekt zu initialisieren. Weitere Informationen finden Sie unter Instanzkonstruktoren.

Sofern die Klasse nicht statischist, erhalten Klassen ohne Konstruktoren einen öffentlichen parameterlosen Konstruktor vom C#-Compiler, um die Instanziierung von Klassen zu ermöglichen. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember.

Sie können verhindern, dass eine Klasse instanziiert wird, indem Sie den Konstruktor wie folgt privat machen:

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

Weitere Informationen finden Sie unter Private Konstruktoren.

Konstruktoren für Strukturtypen ähneln Klassenkonstruktoren. Wenn ein Strukturtyp mit newinstanziiert wird, ruft die Laufzeit einen Konstruktor auf. Wenn ein struct auf den default-Wert festgelegt ist, initialisiert die Laufzeit den gesamten Arbeitsspeicher in der Struktur mit 0. Wenn Sie Feldinitialisierer in einem struct-Datentyp deklarieren, müssen Sie einen parameterlosen Konstruktor angeben. Weitere Informationen finden Sie im Abschnitt zu Strukturinitialisierung und Standardwerten des Artikels Strukturtypen.

Der folgende Code verwendet den parameterlosen Konstruktor für Int32, damit Sie sicher sind, dass der Integer initialisiert wird.

int i = new int();
Console.WriteLine(i);

Der folgende Code verursacht jedoch einen Compilerfehler, da er nicht newverwendet und versucht, ein Objekt zu verwenden, das nicht initialisiert wird:

int i;
Console.WriteLine(i);

Alternativ können auch struct-Typen (einschließlich aller integrierten numerischen Typen) initialisiert oder zugewiesen und anschließend verwendet werden. Beispiel:

int a = 44;  // Initialize the value type...
int b;
b = 33;      // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);

Sowohl Klassen als auch Strukturen können Konstruktoren definieren, die Parameter übernehmen, einschließlich der primären Konstruktoren . Konstruktoren, die Parameter annehmen, müssen über eine new- oder base-Anweisung aufgerufen werden. Klassen und Strukturen können auch mehrere Konstruktoren definieren, und keines ist erforderlich, um einen parameterlosen Konstruktor zu definieren. Zum Beispiel:

public class Employee
{
    public int Salary;

    public Employee() { }

    public Employee(int annualSalary) => Salary = annualSalary;

    public Employee(int weeklySalary, int numberOfWeeks) => Salary = weeklySalary * numberOfWeeks;
}

Diese Klasse kann mithilfe einer der folgenden Anweisungen erstellt werden:

Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

Ein Konstruktor kann das schlüsselwort base verwenden, um den Konstruktor einer Basisklasse aufzurufen. Zum Beispiel:

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

In diesem Beispiel wird der Konstruktor für die Basisklasse aufgerufen, bevor der Block des Konstruktors ausgeführt wird. Das schlüsselwort base kann mit oder ohne Parameter verwendet werden. Alle Parameter des Konstruktors können als Parameter für base oder als Teil eines Ausdrucks verwendet werden. Weitere Informationen finden Sie unter base.

Wenn in einer abgeleiteten Klasse ein Basisklassenkonstruktor nicht explizit mithilfe des schlüsselworts base aufgerufen wird, wird der parameterlose Konstruktor implizit aufgerufen, falls vorhanden. Die folgenden Konstruktordeklarationen sind effektiv identisch:

public Manager(int initialData)
{
    //Add further instructions here.
}
public Manager(int initialData)
    : base()
{
    //Add further instructions here.
}

Wenn eine Basisklasse keinen parameterlosen Konstruktor bietet, muss die abgeleitete Klasse mithilfe von baseeinen expliziten Aufruf an einen Basiskonstruktor durchführen.

Ein Konstruktor kann einen anderen Konstruktor im selben Objekt mithilfe des schlüsselworts this aufrufen. Wie basekann this mit oder ohne Parameter verwendet werden, und alle Parameter im Konstruktor sind als Parameter für thisoder als Teil eines Ausdrucks verfügbar. Der zweite Konstruktor im vorherigen Beispiel kann z.B. über this neu geschrieben werden:

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}

Die Verwendung des schlüsselworts this im vorherigen Beispiel bewirkt, dass der folgende Konstruktor aufgerufen wird:

public Employee(int annualSalary) => Salary = annualSalary;

Konstruktoren können als public, private, protected, internal, protected internal oder private protected gekennzeichnet werden. Diese Zugriffsmodifizierer definieren, wie Benutzer der Klasse die Klasse erstellen können. Weitere Informationen finden Sie unter Zugriffsmodifizierer.

Ein Konstruktor kann mithilfe des schlüsselworts static statisch deklariert werden. Statische Konstruktoren werden automatisch aufgerufen, bevor auf statische Felder zugegriffen wird, und werden zum Initialisieren statischer Klassenmitglieder verwendet. Weitere Informationen finden Sie unter Statische Konstruktoren.

C#-Sprachspezifikation

Weitere Informationen erhalten Sie unter Instanzkonstruktoren und Statische Konstruktoren in der C#-Sprachspezifikation. Die Sprachspezifikation ist die endgültige Quelle für C#-Syntax und -Verwendung.

Weitere Informationen