Megosztás a következőn keresztül:


init (C# referencia)

A init kulcsszó egy tulajdonságban vagy indexelőben definiál egy kiegészítő metódust. Egy init-only setter csak az objektumépítés során rendel hozzá értéket a tulajdonsághoz vagy az indexelőelemhez. A rendszer init kényszeríti a nem módosíthatóságot, így az objektum inicializálása után nem módosítható. A init kiegészítő lehetővé teszi, hogy a kód meghívása objektum inicializáló használatával állítsa be a kezdeti értéket. Ezzel szemben konstruktor meghívásával inicializálni kell az get automatikusan implementált, csak beállítóval rendelkező tulajdonságot. A tartozékokkal private set rendelkező tulajdonság az építés után módosítható, de csak az osztályban.

Az alábbi példa egy nevű tulajdonsághoz YearOfBirthtartozó tartozékot get és init tartozékot is definiál. A tulajdonság értékének visszaadásához egy elnevezett _yearOfBirth magánmezőt használ.

class Person_InitExample
{
     private int _yearOfBirth;

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

A kiegészítő gyakran egyetlen utasításból áll, init amely egy értéket rendel hozzá, ahogyan az előző példában is tette. Emiatt inita következők nem működnek:

var john = new Person_InitExample
{
    YearOfBirth = 1984
};

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

A init tartozék nem kényszeríti a hívókat a tulajdonság beállítására. Ehelyett lehetővé teszi a hívók számára, hogy objektum inicializálót használjanak, miközben tiltják a későbbi módosításokat. Hozzáadhatja a required módosítót, hogy kényszerítse a hívókat egy tulajdonság beállítására. Az alábbi példa egy init csak null értékű tulajdonságot mutat be háttérmezőként. Ha egy hívó nem inicializálja a YearOfBirth tulajdonságot, akkor a tulajdonság alapértelmezett null értéke a következő lesz:

class Person_InitExampleNullability
{
    private int? _yearOfBirth;

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

Ha a hívókat a kezdeti nem null érték beállítására szeretné kényszeríteni, adja hozzá a required módosító értéket az alábbi példában látható módon:

class Person_InitExampleNonNull
{
    private int _yearOfBirth;

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

A init tartozék kifejezési testű tagként is használható. Példa:

class Person_InitExampleExpressionBodied
{
    private int _yearOfBirth;

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

A init kiegészítő automatikus tulajdonságokban is használható, ahogy az alábbi példakód is mutatja:

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

Az alábbi példa egy , csak olvasási és init tulajdonság közötti private setkülönbséget mutatja be. A privát és az írásvédett verzió egyaránt megköveteli, hogy a hívók a hozzáadott konstruktort használják a névtulajdonság beállításához. A private set verzió lehetővé teszi, hogy egy személy módosítsa a nevét a példány létrehozása után. A init verzióhoz nincs szükség konstruktorra. A hívók egy objektum inicializálóval inicializálhatják a tulajdonságokat:

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# nyelvspecifikáció

További információkért lásd a C# nyelvi specifikációját. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.

Lásd még