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. Pengubahreadonly
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."
- Karena jenis nilai secara langsung berisi datanya, bidang yang merupakan jenis nilai
Dalam definisi jenis
readonly struct
,readonly
menunjukkan bahwa jenis struktur tidak dapat diubah. Untuk informasi selengkapnya, lihat bagianreadonly
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 bagianreadonly
anggota instans dari artikel Jenis struktur.Dalam
ref readonly
pengembalian metode, pengubahreadonly
menunjukkan bahwa metode mengembalikan referensi dan penulisan tidak diizinkan untuk referensi tersebut.- Untuk mendeklarasikan
ref readonly
parameter ke metode.
- Untuk mendeklarasikan
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: