Kata init
kunci (Referensi C#)
Kata init
kunci mendefinisikan metode pengakses dalam properti atau pengindeks. Setter khusus init menetapkan nilai ke properti atau elemen pengindeks hanya selama konstruksi objek. Memberlakukan init
kekekalan, sehingga setelah objek diinisialisasi, objek tidak dapat diubah. Aksesor init
memungkinkan kode panggilan menggunakan penginisialisasi objek untuk mengatur nilai awal. Sebaliknya, properti yang diimplementasikan secara otomatis hanya dengan setter get
harus diinisialisasi dengan memanggil konstruktor. Properti dengan private set
aksesor dapat dimodifikasi setelah konstruksi, tetapi hanya di kelas .
Kode berikut menunjukkan aksesor init
dalam properti yang diimplementasikan secara otomatis:
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
Anda mungkin perlu menerapkan salah satu pengakses untuk memberikan validasi parameter. Anda dapat melakukannya menggunakan field
kata kunci, diperkenalkan sebagai fitur pratinjau di C# 13. Kata field
kunci mengakses bidang backing yang disintesis kompilator untuk properti tersebut. Contoh berikut menunjukkan properti tempat init
aksesor memvalidasi rentang value
parameter"
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");
}
}
}
Penting
Kata field
kunci adalah fitur pratinjau di C# 13. Anda harus menggunakan .NET 9 dan mengatur elemen Anda <LangVersion>
ke preview
dalam file proyek Anda untuk menggunakan field
kata kunci kontekstual.
Anda harus berhati-hati menggunakan field
fitur kata kunci di kelas yang memiliki bidang bernama field
. Kata kunci baru field
membayangi bidang bernama field
dalam cakupan aksesor properti. Anda dapat mengubah nama field
variabel, atau menggunakan @
token untuk mereferensikan field
pengidentifikasi sebagai @field
. Anda dapat mempelajari lebih lanjut dengan membaca spesifikasi fitur untuk field
kata kunci.
Aksesor init
dapat digunakan sebagai anggota bertubuh ekspresi. Contoh:
class Person_InitExampleExpressionBodied
{
private int _yearOfBirth;
public int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Contoh berikut menentukan pengakses get
dan init
untuk properti bernama YearOfBirth
. Contoh menggunakan bidang privat bernama _yearOfBirth
untuk mendukung nilai properti.
class Person_InitExample
{
private int _yearOfBirth;
public int YearOfBirth
{
get { return _yearOfBirth; }
init { _yearOfBirth = value; }
}
}
Pengakses init
tidak memaksa penelepon untuk mengatur properti. Sebaliknya, ini memungkinkan penelepon untuk menggunakan penginisialisasi objek sambil melarang modifikasi nanti. Anda dapat menambahkan pengubah required
untuk memaksa penelepon mengatur properti. Contoh berikut menunjukkan satu-satunya init
properti dengan tipe nilai nullable sebagai bidang cadangannya. Jika pemanggil tidak menginisialisasi YearOfBirth
properti , properti tersebut memiliki nilai default null
:
class Person_InitExampleNullability
{
private int? _yearOfBirth;
public int? YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Untuk memaksa penelepon mengatur nilai awal non-null, Anda menambahkan pengubah required
, seperti yang ditunjukkan dalam contoh berikut:
class Person_InitExampleNonNull
{
private int _yearOfBirth;
public required int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Contoh berikut menunjukkan perbedaan antara private set
properti , baca saja, dan init
. Baik versi set privat maupun versi baca saja mengharuskan penelepon untuk menggunakan konstruktor yang ditambahkan untuk mengatur properti nama. Versi ini private set
memungkinkan seseorang untuk mengubah namanya setelah instans dibuat. Versi init
tidak memerlukan konstruktor. Penelepon dapat menginisialisasi properti menggunakan penginisialisasi objek:
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" };
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.