Verwenden von Konstruktoren (C#-Programmierhandbuch)

Wenn eine Klasse oder Struktur instanziiert wird, wird deren Konstruktor aufgerufen. Konstruktoren haben den gleichen Namen wie die Klasse oder Struktur, und sie initialisieren normalerweise die Datenmember des neuen Objekts.

Im folgenden Beispiel wird eine Klasse mit dem Namen Taxi durch Verwendung eines einfachen Konstruktors definiert. Die Klasse wird dann mit dem new-Operator instanziiert. Der Taxi-Konstruktor wird sofort durch den new-Operator aufgerufen, nachdem Speicher für das neue Objekt zugewiesen wurde.

public class Taxi
{
    public bool IsInitialized;

    public Taxi()
    {
        IsInitialized = true;
    }
}

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

Ein Konstruktor, der keine Parameter akzeptiert, wird parameterloser Konstruktor genannt. Parameterlose Konstruktoren werden aufgerufen, wenn ein Objekt durch Verwendung des Operators new instanziiert wird und keine Argumente für new bereitgestellt werden. C# 12 führt primäre Konstruktoren ein. Ein primärer Konstruktor gibt Parameter an, die zum Initialisieren eines neuen Objekts bereitgestellt werden müssen. Weitere Informationen finden Sie unter Instanzkonstruktoren.

Klassen ohne Konstruktoren erhalten vom C#-Compiler einen öffentlichen parameterlosen Konstruktor, um die Instanziierung der Klasse zuzulassen, außer die Klasse ist static. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember.

Sie können verhindern, dass eine Klasse instanziiert wird, indem Sie den Konstruktor auf „privat“ einstellen; dazu müssen Sie wie folgt vorgehen:

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 new instanziiert wird, wird ein Konstruktor aufgerufen. Wenn ein struct-Element auf seinen default-Wert festgelegt ist, initialisiert die Runtime den gesamten Arbeitsspeicher in der Struktur mit 0. Vor C# 10 kann structs keinen expliziten parameterlosen Konstruktor enthalten, weil ein solcher automatisch vom Compiler bereitgestellt wird. Weitere Informationen finden Sie im Abschnitt zu Strukturinitialisierung und Standardwerten des Artikels Strukturtypen.

Der folgende Code verwendet den parameterlosen Konstruktor z. B. für Int32, damit sichergestellt ist, dass der Integertyp initialisiert wird:

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

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

int i;
Console.WriteLine(i);

Alternativ können auch Objekte, die auf structs basieren, – einschließlich aller integrierten numerischen Typen – initialisiert oder zugewiesen und anschließend verwendet werden, so wie im folgenden 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 annehmen, einschließlich primärer 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 dieser beiden Elemente wird zum Definieren eines parameterlosen Konstruktors benötigt. 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 aller 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 der Basisklasse aufgerufen, bevor der Block eines 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 ein Konstruktor der Basisklasse in einer abgeleiteten Klasse nicht explizit durch das Schlüsselwort base aufgerufen wird, wird der parameterlose Konstruktor (falls vorhanden) implizit aufgerufen. Die folgenden Deklarationen Konstruktordeklarationen sind praktisch identisch:

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

Wenn eine Basisklasse keinen parameterlosen Konstruktor bereitstellt, muss die abgeleitete Klasse einen expliziten Aufruf des Basiskonstruktors mithilfe von base durchführen.

Ein Konstruktor kann einen anderen Konstruktor in demselben Objekt über das Schlüsselwort this aufrufen. Genau wie base kann this mit oder ohne Parameter verwendet werden, und alle Parameter im Konstruktor sind als Parameter für this oder 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 dieser Konstruktor aufgerufen wird:

public Employee(int annualSalary)
{
    Salary = annualSalary;
}

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

Ein Konstruktor kann mithilfe des Schlüsselworts static als statisch deklariert werden. Statische Konstruktoren werden automatisch unmittelbar vor dem Zugriff auf ein statisches Feld aufgerufen. Sie werden generell zum Initialisieren statischer Klassenmember verwendet. Weitere Informationen finden Sie unter Statische Konstruktoren.

C#-Programmiersprachenspezifikation

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

Weitere Informationen