Freigeben über


Das init Schlüsselwort (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.

Der folgende Code veranschaulicht einen init Accessor in einer automatisch implementierten Eigenschaft:

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

Möglicherweise müssen Sie einen der Accessoren implementieren, um die Parameterüberprüfung bereitzustellen. Dazu können Sie das field Schlüsselwort verwenden, das als Vorschaufeature in C# 13 eingeführt wurde. Das field Schlüsselwort greift auf das compilersynthetisierte Sicherungsfeld für diese Eigenschaft zu. Das folgende Beispiel zeigt eine Eigenschaft, in der der init Accessor den Bereich des value Parameters überprüft"

class Person_InitExampleFieldProperty
{
    public int YearOfBirth
    {
        get;
        init
        {
            field = (YearOfBirth <= DateTime.Now.Year)
                ? value
                : throw new ArgumentOutOfRangeException(nameof(value), "Year of birth can't be in the future");
        }
    }
}

Wichtig

Das field Schlüsselwort ist ein Vorschaufeature in C# 13. Sie müssen .NET 9 verwenden und das <LangVersion> Element preview in Der Projektdatei festlegen, um das field Kontextschlüsselwort zu verwenden.

Achten Sie darauf, die field Schlüsselwortfunktion in einer Klasse zu verwenden, die ein Feld mit dem Namen fieldhat. Das neue field Schlüsselwort schattiert ein Feld, das im Bereich eines Eigenschaftenaccessors benannt field ist. Sie können entweder den Namen der field Variablen ändern oder das @ Token verwenden, um auf den field Bezeichner zu verweisen als @field. Weitere Informationen erhalten Sie, indem Sie die Featurespezifikation für das field Schlüsselwort lesen.

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

class Person_InitExampleExpressionBodied
{
    private int _yearOfBirth;

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

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; }
     }
}

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, weist diese Eigenschaft den Standardwert null auf:

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;
    }
}

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#.

Weitere Informationen