Verwenden von Konstruktoren (C#-Programmierhandbuch)

Konstruktoren sind Klassenmethoden, die ausgeführt werden, wenn ein Objekt eines bestimmten Typs erstellt wird. Konstruktoren haben denselben Namen wie die Klasse und initialisieren normalerweise die Datenmember des neuen Objekts.

Im folgenden Beispiel wird die Klasse Taxi durch einen einfachen Konstruktor definiert. Anschließend wird diese Klasse mithilfe des Operators new instanziiert. Der Operator new ruft den Taxi-Konstruktor unmittelbar nach der Belegung von Arbeitsspeicher für das neue Objekt auf.

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 annimmt, wird als Standardkonstruktor bezeichnet. Standardkonstruktoren werden immer dann aufgerufen, wenn ein Objekt mit dem Operator new instanziiert wird und keine Argumente für new bereitgestellt werden. Weitere Informationen finden Sie unter Instanzkonstruktoren (C#-Programmierhandbuch).

Alle nicht statischen Klassen ohne Konstruktoren erhalten vom C#-Compiler einen öffentlichen Standardkonstruktor, um die Klasseninstanziierung zu ermöglichen. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember (C#-Programmierhandbuch).

Sie können verhindern, dass eine Klasse instanziiert wird, indem Sie den Konstruktor auf folgende Art und Weise privat machen:

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

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

Weitere Informationen finden Sie unter Private Konstruktoren (C#-Programmierhandbuch).

Konstruktoren für struct-Typen ähneln Klassenkonstruktoren. Allerdings können structs keinen expliziten Standardkonstruktor enthalten, da dieser automatisch vom Compiler bereitgestellt wird. Dieser Konstruktor initialisiert alle Felder in struct mit den Standardwerten. Weitere Informationen finden Sie unter Tabelle für Standardwerte (C#-Referenz). Allerdings wird dieser Standardkonstruktor nur aufgerufen, wenn struct mit new instanziiert wird. Im folgenden Code wird beispielsweise der Standardkonstruktor für Int32 verwendet, sodass sichergestellt ist, dass der ganzzahlige Typ initialisiert wird:

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

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

int i;
Console.WriteLine(i);

Alternativ können auf structs basierende Objekte, einschließlich aller integrierten numerischen Typen, initialisiert oder zugewiesen und anschließend wie im folgenden Beispiel verwendet werden:

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

Das Aufrufen des Standardkonstruktors für einen Werttyp ist demnach nicht erforderlich.

Sowohl in Klassen als auch in structs können Konstruktoren definiert werden, die Parameter entgegennehmen. Konstruktoren, die Parameter annehmen, müssen durch eine new-Anweisung oder eine Basisanweisung aufgerufen werden. In Klassen und structs können auch mehrere Konstruktoren definiert werden, und es ist in beiden Fällen nicht erforderlich, einen Standardkonstruktor zu definieren. Beispiele:

public class Employee
{
    public int salary;

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

    public Employee(int weeklySalary, int numberOfWeeks)
    {
        salary = weeklySalary * numberOfWeeks;
    }
}

Diese Klasse kann mit einer der beiden folgenden Anweisungen erstellt werden:

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

Mithilfe des base-Schlüsselworts kann ein Konstruktor den Konstruktor einer Basisklasse aufrufen. Beispiele:

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 Konstruktorblock ausgeführt wird. Das base-Schlüsselwort kann mit oder ohne Parameter verwendet werden. Alle Parameter, die dem Konstruktor übergeben wurden, können als Parameter für base oder als Teil eines Ausdrucks verwendet werden. Weitere Informationen finden Sie unter base (C#-Referenz).

Wenn ein Basisklassenkonstruktor in einer abgeleiteten Klasse nicht explizit mit dem base-Schlüsselwort aufgerufen wird, wird implizit der Standardkonstruktor (sofern vorhanden) aufgerufen. Dies bedeutet, dass die folgenden Konstruktordeklarationen dieselben Auswirkungen haben:

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 den Basiskonstruktor mithilfe von base explizit aufrufen.

Ein Konstruktor kann einen anderen Konstruktor in demselben Objekt aufrufen, indem er das this-Schlüsselwort verwendet. Wie base kann auch this mit oder ohne Parameter verwendet werden, und alle dem Konstruktor übergebenen Parameter können als Parameter für this oder als Teil eines Ausdrucks verwendet werden. So kann zum Beispiel der zweite Konstruktor im vorigen Beispiel mit this umgeschrieben werden:

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

Die Verwendung des this-Schlüsselworts im vorherigen Beispiel bewirkt das Aufrufen dieses Konstruktors:

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

Konstanten können als public, private, protected, internal oder protected internal gekennzeichnet werden. Diese Zugriffsmodifizierer definieren, auf welche Weise Benutzer der Klasse die Klasse konstruieren können. Weitere Informationen finden Sie unter Zugriffsmodifizierer.

Ein Konstruktor kann mithilfe des static-Schlüsselworts als statisch deklariert werden. Statische Konstruktoren werden unmittelbar vor dem Zugriff auf statische Felder automatisch aufgerufen. Im Allgemeinen werden mit ihrer Hilfe statische Klassenmember initialisiert. Weitere Informationen finden Sie unter Statische Konstruktoren.

C#-Programmiersprachenspezifikation

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

Siehe auch

Referenz

Klassen und Strukturen (C#-Programmierhandbuch)

Konstruktoren (C#-Programmierhandbuch)

Destruktoren (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch