Verwenden von Konstruktoren (C#-Programmierhandbuch)

Wenn eine Klasse oder Struktur erstellt 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 Standardkonstruktor genannt. Standardkonstruktoren werden aufgerufen, wenn ein Objekt durch Verwendung des new-Operators instanziiert wird und keine Argumente für new bereitgestellt werden. Weitere Informationen finden Sie unter Instanzkonstruktoren.

Klassen ohne Konstruktoren erhalten vom C#-Compiler einen öffentlichen Standardkonstruktor, 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 struct-Typen ähneln Klassenkonstruktoren, structs können aber keinen expliziten Standardkonstruktor enthalten, da er automatisch vom Compiler bereitgestellt wird. Dieser Konstruktor initialisiert alle Felder in struct auf die Standardwerte. Weitere Informationen finden Sie unter Tabelle für Standardwerte. Dieser Standardkonstruktor wird jedoch nur aufgerufen, wenn struct mit new instanziiert wird. Dieser Code verwendet den Standardkonstruktor z.B. für Int32, damit sichergestellt ist, dass der ganzzahlige Typ 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);  

Es ist also nicht erforderlich, einen Standardkonstruktor für einen Werttyp aufzurufen.

Sowohl Klassen als auch structs können Konstruktoren definieren, die Parameter annehmen. Konstruktoren, die Parameter annehmen, müssen über eine new- oder base-Anweisung aufgerufen werden. Klassen und structs können also mehrere Konstruktoren definieren, und keine von beiden wird zum Definieren eines Standardkonstruktors benötigt. Beispiel:

public class Employee
{
    public int salary;

    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 Standardkonstruktor (falls vorhanden) implizit aufgerufen. Dies bedeutet, dass die folgenden Deklarationen identisch sind:

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

Wenn eine Basisklasse keinen Standardkonstruktor bereitstellt, muss die abgeleitete Klasse einen expliziten Aufruf an den Basiskonstruktor 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 oder protected internal 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 aufgerufen, unmittelbar bevor auf ein statisches Feld zugegriffen wird, und werden generell zum Initialisieren statischer Klassenmember verwendet. Weitere Informationen finden Sie unter Statische Konstruktoren.

C#-Programmiersprachenspezifikation

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

Siehe auch

C#-Programmierhandbuch
Klassen und Strukturen
Konstruktoren
Finalizer