Verwenden von Konstruktoren (C#-Programmierhandbuch)Using Constructors (C# Programming Guide)

Wenn eine Klasse oder Struktur erstellt wird, wird deren Konstruktor aufgerufen.When a class or struct is created, its constructor is called. Konstruktoren haben den gleichen Namen wie die Klasse oder Struktur, und sie initialisieren normalerweise die Datenmember des neuen Objekts.Constructors have the same name as the class or struct, and they usually initialize the data members of the new object.

Im folgenden Beispiel wird eine Klasse mit dem Namen Taxi durch Verwendung eines einfachen Konstruktors definiert.In the following example, a class named Taxi is defined by using a simple constructor. Die Klasse wird dann mit dem new-Operator instanziiert.This class is then instantiated with the new operator. Der Taxi-Konstruktor wird sofort durch den new-Operator aufgerufen, nachdem Speicher für das neue Objekt zugewiesen wurde.The Taxi constructor is invoked by the new operator immediately after memory is allocated for the new object.

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.A constructor that takes no parameters is called a default constructor. Standardkonstruktoren werden aufgerufen, wenn ein Objekt durch Verwendung des new-Operators instanziiert wird und keine Argumente für new bereitgestellt werden.Default constructors are invoked whenever an object is instantiated by using the new operator and no arguments are provided to new. Weitere Informationen finden Sie unter Instanzkonstruktoren.For more information, see Instance Constructors.

Klassen ohne Konstruktoren erhalten vom C#-Compiler einen öffentlichen Standardkonstruktor, um die Instanziierung der Klasse zuzulassen, außer die Klasse ist static.Unless the class is static, classes without constructors are given a public default constructor by the C# compiler in order to enable class instantiation. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember.For more information, see Static Classes and Static Class Members.

Sie können verhindern, dass eine Klasse instanziiert wird, indem Sie den Konstruktor auf „privat“ einstellen; dazu müssen Sie wie folgt vorgehen:You can prevent a class from being instantiated by making the constructor private, as follows:

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

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

Weitere Informationen finden Sie unter Private Konstruktoren.For more information, see Private Constructors.

Konstruktoren für struct-Typen ähneln Klassenkonstruktoren, structs können aber keinen expliziten Standardkonstruktor enthalten, da er automatisch vom Compiler bereitgestellt wird.Constructors for struct types resemble class constructors, but structs cannot contain an explicit default constructor because one is provided automatically by the compiler. Dieser Konstruktor initialisiert alle Felder in struct auf die Standardwerte.This constructor initializes each field in the struct to the default values. Weitere Informationen finden Sie unter Tabelle für Standardwerte.For more information, see Default Values Table. Dieser Standardkonstruktor wird jedoch nur aufgerufen, wenn struct mit new instanziiert wird.However, this default constructor is only invoked if the struct is instantiated with new. Dieser Code verwendet den Standardkonstruktor z.B. für Int32, damit sichergestellt ist, dass der ganzzahlige Typ initialisiert wird:For example, this code uses the default constructor for Int32, so that you are assured that the integer is initialized:

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:The following code, however, causes a compiler error because it does not use new, and because it tries to use an object that has not been initialized:

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:Alternatively, objects based on structs (including all built-in numeric types) can be initialized or assigned and then used as in the following example:

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.So calling the default constructor for a value type is not required.

Sowohl Klassen als auch structs können Konstruktoren definieren, die Parameter annehmen.Both classes and structs can define constructors that take parameters. Konstruktoren, die Parameter annehmen, müssen über eine new- oder base-Anweisung aufgerufen werden.Constructors that take parameters must be called through a new statement or a base statement. Klassen und structs können also mehrere Konstruktoren definieren, und keine von beiden wird zum Definieren eines Standardkonstruktors benötigt.Classes and structs can also define multiple constructors, and neither is required to define a default constructor. Zum Beispiel:For example:

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:This class can be created by using either of the following statements:

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.A constructor can use the base keyword to call the constructor of a base class. Zum Beispiel:For example:

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.In this example, the constructor for the base class is called before the block for the constructor is executed. Das Schlüsselwort base kann mit oder ohne Parameter verwendet werden.The base keyword can be used with or without parameters. Alle Parameter des Konstruktors können als Parameter für base oder als Teil eines Ausdrucks verwendet werden.Any parameters to the constructor can be used as parameters to base, or as part of an expression. Weitere Informationen finden Sie unter base.For more information, see 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.In a derived class, if a base-class constructor is not called explicitly by using the base keyword, the default constructor, if there is one, is called implicitly. Dies bedeutet, dass die folgenden Deklarationen identisch sind:This means that the following constructor declarations are effectively the same:

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.If a base class does not offer a default constructor, the derived class must make an explicit call to a base constructor by using base.

Ein Konstruktor kann einen anderen Konstruktor in demselben Objekt über das Schlüsselwort this aufrufen.A constructor can invoke another constructor in the same object by using the this keyword. 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.Like base, this can be used with or without parameters, and any parameters in the constructor are available as parameters to this, or as part of an expression. Der zweite Konstruktor im vorherigen Beispiel kann z.B. über this neu geschrieben werden:For example, the second constructor in the previous example can be rewritten using this:

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

Die Verwendung des Schlüsselworts this im vorherigen Beispiel bewirkt, dass dieser Konstruktor aufgerufen wird:The use of the this keyword in the previous example causes this constructor to be called:

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

Konstruktoren können gekennzeichnet werden, als öffentlichen, private, geschützt, interne, protected internaloder privaten, geschützten.Constructors can be marked as public, private, protected, internal, protected internal or private protected. Diese Zugriffsmodifizierer definieren, wie Benutzer der Klasse die Klasse konstruieren können.These access modifiers define how users of the class can construct the class. Weitere Informationen finden Sie unter Zugriffsmodifizierer.For more information, see Access Modifiers.

Ein Konstruktor kann mithilfe des Schlüsselworts static als statisch deklariert werden.A constructor can be declared static by using the static keyword. Statische Konstruktoren werden automatisch aufgerufen, unmittelbar bevor auf ein statisches Feld zugegriffen wird, und werden generell zum Initialisieren statischer Klassenmember verwendet.Static constructors are called automatically, immediately before any static fields are accessed, and are generally used to initialize static class members. Weitere Informationen finden Sie unter Statische Konstruktoren.For more information, see Static Constructors.

C#-ProgrammiersprachenspezifikationC# Language Specification

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

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
Klassen und StrukturenClasses and Structs
KonstruktorenConstructors
FinalizerFinalizers