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