A init
kulcsszó (C# referenciája)
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 egy konstruktor meghívásával inicializálni kell egy get
automatikusan implementált tulajdonságot, amely csak egy beállítóval rendelkezik. 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 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 a field
C# 13 előzetes verziójában bemutatott 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 olyan 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");
}
}
}
Fontos
A field
kulcsszó egy előzetes verziójú funkció a C# 13-ban. A környezetfüggő kulcsszó használatához a .NET 9-et kell használnia, és be kell állítania <LangVersion>
az elemet preview
a field
projektfájlban.
Körültekintően használja a field
kulcsszó funkciót egy olyan osztályban, amelynek neve field
egy mező. Az új field
kulcsszó árnyékot ad egy tulajdonság-tartozék hatókörében elnevezett field
mezőnek. Módosíthatja field
a változó nevét, vagy a @
jogkivonat használatával hivatkozhat az field
azonosítóra @field
. További információkért olvassa el a kulcsszó funkciós specifikációjátfield
.
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 YearOfBirth
tartozó 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 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 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;
}
}
Az alábbi példa egy , csak olvasási és init
tulajdonság közötti private set
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.