init (C#-referens)
Nyckelordet init
definierar en accessor-metod i en egenskap eller indexerare. En init-only-setter tilldelar ett värde till egenskapen eller indexerarelementet endast under objektkonstruktionen. En init
framtvingar oföränderlighet, så att det inte kan ändras när objektet har initierats. En init
accessor gör det möjligt för anropande kod att använda en objektinitierare för att ange det ursprungliga värdet. Däremot måste en automatiskt implementerad egenskap med endast en get
setter initieras genom att anropa en konstruktor. En egenskap med en private set
accessor kan ändras efter konstruktionen, men endast i klassen.
I följande exempel definieras både en get
och en init
accessor för en egenskap med namnet YearOfBirth
. Det använder ett privat fält med namnet _yearOfBirth
för att stödja egenskapsvärdet.
class Person_InitExample
{
private int _yearOfBirth;
public int YearOfBirth
{
get { return _yearOfBirth; }
init { _yearOfBirth = value; }
}
}
init
Ofta består accessorn av en enda instruktion som tilldelar ett värde, som det gjorde i föregående exempel. På grund av init
fungerar inte följande:
var john = new Person_InitExample
{
YearOfBirth = 1984
};
john.YearOfBirth = 1926; //Not allowed, as its value can only be set once in the constructor
En init
accessor tvingar inte anropare att ange egenskapen. I stället kan anropare använda en objektinitierare samtidigt som senare ändringar inte tillåts. Du kan lägga till required
modifieraren för att tvinga anropare att ange en egenskap. I följande exempel visas en init
enda egenskap med en nullbar värdetyp som bakgrundsfält. Om en anropare inte initierar YearOfBirth
egenskapen har den egenskapen standardvärdet null
:
class Person_InitExampleNullability
{
private int? _yearOfBirth;
public int? YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Om du vill tvinga anropare att ange ett initialt värde som inte är null lägger du till required
modifieraren, som du ser i följande exempel:
class Person_InitExampleNonNull
{
private int _yearOfBirth;
public required int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Accessorn init
kan användas som en uttrycksfyllig medlem. Exempel:
class Person_InitExampleExpressionBodied
{
private int _yearOfBirth;
public int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Accessorn init
kan också användas i autoimplementerade egenskaper, vilket visas i följande exempelkod:
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
I följande exempel visas skillnaden mellan en private set
, skrivskyddad och init
egenskap. Både den privata uppsättningens version och den skrivskyddade versionen kräver att anropare använder den tillagda konstruktorn för att ange namnegenskapen. Med private set
versionen kan en person ändra sitt namn när instansen har konstruerats. Versionen init
kräver ingen konstruktor. Anropare kan initiera egenskaperna med hjälp av en objektinitierare:
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" };
Språkspecifikation för C#
Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.