Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A
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 a konstruktor meghívásával inicializálni kell egy automatikusan implementált tulajdonságot , amely csak tartozékot get tartalmazhat. A tartozékokkal private set rendelkező tulajdonság az építés után módosítható, de csak az osztályban.
A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.
A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.
Jótanács
Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.
Az alábbi kód egy init automatikusan implementált tulajdonság egyik tartozékát mutatja be:
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
Előfordulhat, hogy az egyik tartozékot implementálnia kell a paraméterérvényesítés biztosításához. Ezt az ellenőrzést a field C# 14-ben bevezetett kulcsszóval teheti meg. A field kulcsszó hozzáfér az adott tulajdonsághoz tartozó fordító szintetizált háttérmezőhöz. Az alábbi példa egy tulajdonságot mutat be, amelyben a init tartozék ellenőrzi a paraméter tartományát value .
class Person_InitExampleFieldProperty
{
public int YearOfBirth
{
get;
init
{
field = (value <= DateTime.Now.Year)
? value
: throw new ArgumentOutOfRangeException(nameof(value), "Year of birth can't be in the future");
}
}
}
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;
}
}
Az alábbi példa egy nevű tulajdonsághoz gettartozó tartozékot init és YearOfBirth 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 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:
class Person_InitExampleNullability
{
private int? _yearOfBirth;
public int? YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Ha azt szeretné, hogy a hívók egy kezdeti nem null értékű értéket állítsanak be, adja hozzá a required módosító értékét 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;
}
}
Az alábbi példa egy írásvédett és init egy private settulajdonság közötti kü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.