Bagikan melalui


readonly (referensi C#)

readonly Gunakan kata kunci sebagai pengubah dalam lima konteks:

  • Dalam deklarasi bidang, readonly berarti Anda hanya dapat menetapkan bidang selama deklarasi atau di konstruktor di kelas yang sama. Anda dapat menetapkan dan menetapkan ulang bidang baca-saja beberapa kali dalam deklarasi bidang dan konstruktor.

    Anda tidak dapat menetapkan readonly bidang setelah konstruktor selesai. Aturan ini memengaruhi jenis nilai dan jenis referensi secara berbeda:

    • Karena jenis nilai secara langsung berisi datanya, bidang yang merupakan readonly jenis nilai tidak dapat diubah.
    • Karena jenis referensi berisi referensi ke datanya, bidang yang merupakan readonly jenis referensi harus selalu merujuk ke objek yang sama. Objek itu mungkin tidak dapat diubah. Pengubah readonly mencegah penggantian nilai bidang dengan instans lain dari tipe 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 mungkin memicu peringatan CA2104 : "Jangan nyatakan baca hanya jenis referensi yang dapat diubah."

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

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

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

Referensi bahasa C# mendokumentasikan versi bahasa C# yang paling baru dirilis. Ini juga berisi dokumentasi awal untuk fitur dalam pratinjau publik untuk rilis bahasa yang akan datang.

Dokumentasi mengidentifikasi fitur apa pun yang pertama kali diperkenalkan dalam tiga versi terakhir bahasa atau dalam pratinjau publik saat ini.

Petunjuk / Saran

Untuk menemukan kapan fitur pertama kali diperkenalkan di C#, lihat artikel tentang riwayat versi bahasa C#.

Contoh bidang readonly

Dalam contoh ini, Anda tidak dapat mengubah nilai year bidang dalam ChangeYear metode , meskipun konstruktor kelas menetapkan nilai ke dalamnya:

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

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

  • Saat Anda menginisialisasi variabel dalam deklarasi, misalnya:

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

  • Dalam konstruktor statis dari kelas yang menyertakan deklarasi lapangan statis.

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

Nota

Kata kunci readonly berbeda dengan kata kunci const. Anda hanya dapat menginisialisasi const bidang pada deklarasi bidang. Anda dapat menetapkan readonly bidang 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 const bidang adalah konstanta waktu kompilasi, readonly bidang 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 hanya-baca tidak dapat diberikan nilai (kecuali dalam konstruktor atau penginisialisasi variabel)

Anggota instans baca-saja

Gunakan pengubah readonly untuk menyatakan bahwa anggota instans tidak mengubah status struct.

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

Nota

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

Untuk contoh selengkapnya, lihat readonly bagian anggota instans dari artikel Jenis struktur .

Contoh penggunaan ref, readonly, dan return

readonly Pengubah pada ref return menunjukkan bahwa referensi yang dikembalikan tidak dapat dimodifikasi. Contoh berikut mengembalikan referensi ke asal. Ini menggunakan pengubah readonly untuk menunjukkan bahwa penelepon 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 ref dapat mengembalikan juga dapat dikembalikan oleh ref readonly.

Contoh pengembalian ref readonly dan return readonly

Anda juga dapat menggunakan ref readonly return 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 readonly bersama dengan anggota instans, dalam hal ini sebuah metode, yang berada dalam kondisi 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#.

Lihat juga