Bagikan melalui


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 setproperti , 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#.

Lihat juga