init (C#-Referenz)

Mit dem init-Schlüsselwort wird eine Zugriffsmethode in einer Eigenschaft oder einem Indexer definiert. Ein reiner init-Setter weist der Eigenschaft oder dem Indexerelement nur während der Objekterstellung einen Wert zu. Durch init wird Unveränderlichkeit erzwungen, sodass das Objekt nach der Initialisierung nicht mehr geändert werden kann. Eine init-Zugriffsmethode ermöglicht es aufrufendem Code, einen Objektinitialisierer zum Festlegen des Ausgangswerts zu verwenden. Im Gegensatz dazu muss eine automatisch implementierte Eigenschaft mit nur einem get Setter durch Aufrufen eines Konstruktors initialisiert werden. Eine Eigenschaft mit einer private set-Zugriffsmethode kann nach der Erstellung geändert werden, jedoch nur in der Klasse.

Im folgenden Beispiel werden eine get- und eine init-Zugriffsmethode für eine Eigenschaft namens YearOfBirth definiert. Im Beispiel wird ein privates Feld mit dem Namen _yearOfBirth verwendet, um den Eigenschaftswert zu unterstützen.

class Person_InitExample
{
     private int _yearOfBirth;

     public int YearOfBirth
     {
         get { return _yearOfBirth; }
         init { _yearOfBirth = value; }
     }
}

Der init-Accessor besteht häufig aus einer einzelnen Anweisung, die einen Wert zurückgibt (wie im vorherigen Beispiel gezeigt). Aufgrund von init funktioniert Folgendes nicht:

var john = new Person_InitExample
{
    YearOfBirth = 1984
};

john.YearOfBirth = 1926; //Not allowed, as its value can only be set once in the constructor

Eine init-Zugriffsmethode erzwingt nicht, dass Aufrufer die Eigenschaft festlegen. Stattdessen können Aufrufer einen Objektinitialisierer verwenden, wobei eine spätere Änderung verhindert wird. Sie können den required-Modifizierer hinzufügen und damit erzwingen, dass Aufrufer eine Eigenschaft festlegen müssen. Das folgende Beispiel zeigt eine init-exklusive Eigenschaft mit einem Nullwerte zulassenden Werttyp als Unterstützungsvariable. Wenn ein Aufrufer die YearOfBirth-Eigenschaft nicht initialisiert, hat diese den Standardwert null:

class Person_InitExampleNullability
{
    private int? _yearOfBirth;

    public int? YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

Um zu erzwingen, dass Aufrufer einen Ausgangswert ungleich NULL festlegen, fügen Sie den required-Modifizierer hinzu. Dies wird im folgenden Beispiel gezeigt:

class Person_InitExampleNonNull
{
    private int _yearOfBirth;

    public required int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

Die init-Zugriffsmethode kann als Ausdruckskörperelement verwendet werden. Beispiel:

class Person_InitExampleExpressionBodied
{
    private int _yearOfBirth;

    public int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

Die init-Zugriffsmethode kann auch in automatisch implementierten Eigenschaften verwendet werden, wie der folgende Beispielcode veranschaulicht:

class Person_InitExampleAutoProperty
{
    public int YearOfBirth { get; init; }
}

Das folgende Beispiel zeigt die Unterscheidung zwischen einer private set-, schreibgeschützten und init-Eigenschaft. Sowohl für die private set-Version als auch für die schreibgeschützte Version sind Aufrufer erforderlich, um den hinzugefügten Konstruktor zum Festlegen der Namenseigenschaft zu verwenden. Die private set-Version ermöglicht es Benutzer*innen, ihren Namen nach dem Erstellen der Instanz zu ändern. Für die init-Version ist kein Konstruktor erforderlich. Aufrufer können die Eigenschaften mithilfe eines Objektinitialisierers initialisieren:

class PersonPrivateSet
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public PersonPrivateSet(string first, string last) => (FirstName, LastName) = (first, last);

    public void ChangeName(string first, string last) => (FirstName, LastName) = (first, last);
}

class PersonReadOnly
{
    public string FirstName { get; }
    public string LastName { get; }
    public PersonReadOnly(string first, string last) => (FirstName, LastName) = (first, last);
}

class PersonInit
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}
PersonPrivateSet personPrivateSet = new("Bill", "Gates");
PersonReadOnly personReadOnly = new("Bill", "Gates");
PersonInit personInit = new() { FirstName = "Bill", LastName = "Gates" };

C#-Sprachspezifikation

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

Siehe auch