Bagikan melalui


readonly (Referensi C# )

Kata readonly kunci adalah pengubah yang dapat digunakan dalam lima konteks:

  • Dalam deklarasi bidang, readonly menunjukkan bahwa penugasan ke bidang hanya dapat terjadi sebagai bagian dari deklarasi atau dalam konstruktor di kelas yang sama. Bidang readonly dapat ditugaskan dan ditugaskan kembali beberapa kali dalam deklarasi bidang dan konstruktor.

    Bidang readonly tidak dapat ditetapkan setelah konstruktor keluar. Aturan ini memiliki implikasi yang berbeda untuk jenis nilai dan jenis referensi:

    • Karena jenis nilai secara langsung berisi datanya, bidang yang merupakan jenis nilai readonly tidak dapat diubah.
    • Karena jenis referensi berisi referensi ke datanya, bidang yang merupakan jenis referensi readonly harus selalu merujuk ke objek yang sama. Objek itu mungkin tidak dapat diubah. Pengubah readonly mencegah mengganti nilai bidang dengan instans yang berbeda dari jenis referensi. Namun, pengubah tidak mencegah data instans bidang dimodifikasi melalui bidang baca-saja.

    Peringatan

    Jenis yang terlihat secara eksternal yang berisi bidang baca-saja yang terlihat secara eksternal yang merupakan jenis referensi yang dapat diubah mungkin merupakan kerentanan keamanan dan dapat memicu peringatan CA2104 : "Jangan mendeklarasikan baca hanya jenis referensi yang dapat diubah."

  • Dalam definisi jenis readonly struct, readonly menunjukkan bahwa jenis struktur tidak dapat diubah. Untuk informasi selengkapnya, lihat bagian readonly struct dari artikel Jenis struktur.

  • Dalam deklarasi anggota instans dalam jenis struktur, readonly menunjukkan bahwa anggota instans tidak mengubah status struktur. Untuk informasi selengkapnya, lihat bagian readonly anggota instans dari artikel Jenis struktur.

  • Dalam ref readonly pengembalian metode, pengubah readonly menunjukkan bahwa metode mengembalikan referensi dan penulisan tidak diizinkan untuk referensi tersebut.

Contoh bidang readonly

Dalam contoh ini, nilai bidang year tidak dapat diubah dalam metode ChangeYear, meskipun diberi nilai di konstruktor kelas:

class Age
{
    private readonly int _year;
    Age(int year)
    {
        _year = year;
    }
    void ChangeYear()
    {
        //_year = 1967; // Compile error if uncommented.
    }
}

Anda bisa menetapkan nilai ke bidang readonly hanya dalam konteks berikut:

  • Ketika variabel diinisialisasi dalam deklarasi, misalnya:

    public readonly int y = 5;
    
  • Dalam konstruktor instance kelas yang berisi deklarasi bidang instans.

  • Dalam konstruktor statis kelas yang berisi deklarasi bidang statis.

Konteks konstruktor ini juga merupakan satu-satunya konteks yang valid untuk meneruskan bidang readonly sebagai parameter out atau ref.

Catatan

Kata kunci readonly berbeda dari kata kunci const. Bidang const hanya dapat diinisialisasi pada deklarasi bidang. Bidang readonly dapat ditetapkan beberapa kali dalam deklarasi bidang dan di konstruktor apa pun. Oleh karena itu, bidang readonly dapat memiliki nilai yang berbeda tergantung pada konstruktor yang digunakan. Selain itu, meskipun bidang const adalah konstanta waktu kompilasi, bidang readonly dapat digunakan untuk konstanta run-time, seperti dalam contoh berikut:

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
public class SamplePoint
{
    public int x;
    // Initialize a readonly field
    public readonly int y = 25;
    public readonly int z;

    public SamplePoint()
    {
        // Initialize a readonly instance field
        z = 24;
    }

    public SamplePoint(int p1, int p2, int p3)
    {
        x = p1;
        y = p2;
        z = p3;
    }

    public static void Main()
    {
        SamplePoint p1 = new SamplePoint(11, 21, 32);   // OK
        Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
        SamplePoint p2 = new SamplePoint();
        p2.x = 55;   // OK
        Console.WriteLine($"p2: x={p2.x}, y={p2.y}, z={p2.z}");
    }
    /*
     Output:
        p1: x=11, y=21, z=32
        p2: x=55, y=25, z=24
    */
}

Dalam contoh sebelumnya, jika Anda menggunakan pernyataan seperti contoh berikut:

p2.y = 66;        // Error

Anda mendapatkan pesan kesalahan pengkompilasi:

Bidang readonly tidak dapat ditetapkan ke (kecuali dalam konstruktor atau penginisialisasi variabel)

Anggota instans baca-saja

Anda juga dapat menggunakan pengubah readonly untuk menyatakan bahwa anggota instans tidak mengubah status struct.

public readonly double Sum()
{
    return X + Y;
}

Catatan

Dalam kasus properti baca/tulis, Anda dapat menambahkan pengubah readonly ke get aksesor. Beberapa get aksesor dapat melakukan penghitungan dan cache hasilnya, daripada hanya mengembalikan nilai bidang privat. Menambahkan pengubah readonly ke get aksesor menjamin bahwa get aksesor tidak mengubah status internal objek dengan menyimpan hasil apa pun.

Anda dapat menemukan lebih banyak contoh di bagian readonly anggota instans dari artikel Jenis struktur.

Contoh pengembalian readonly ref

Pengubah readonly pada ref return menunjukkan bahwa referensi yang dikembalikan tidak dapat dimodifikasi. Contoh berikut mengembalikan referensi ke asal. Ini menggunakan pengubah readonly untuk menunjukkan bahwa pemanggil tidak dapat mengubah asal:

private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;

Jenis yang dikembalikan tidak perlu menjadi readonly struct. Jenis apa pun yang dapat dikembalikan oleh ref dapat dikembalikan oleh ref readonly.

Contoh pengembalian readonly ref readonly

A ref readonly return juga dapat digunakan dengan readonly anggota instans pada struct jenis:

public struct ReadonlyRefReadonlyExample
{
    private int _data;

    public readonly ref readonly int ReadonlyRefReadonly(ref int reference)
    {
        // _data = 1; // Compile error if uncommented.
        return ref reference;
    }
}

Metode ini pada dasarnya mengembalikan referensi bersama dengan anggota instans readonly (dalam hal ini metode) ( readonly tidak dapat memodifikasi bidang instans apa pun).

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.

Anda juga dapat melihat proposal spesifikasi bahasa:

Lihat juga