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

Se även