Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kata readonly kunci adalah pengubah yang dapat digunakan dalam lima konteks:
Dalam deklarasi bidang,
readonlymenunjukkan bahwa penugasan ke bidang hanya dapat terjadi sebagai bagian dari deklarasi atau dalam konstruktor di kelas yang sama. Bidang readonly dapat ditetapkan dan ditetapkan ulang beberapa kali dalam deklarasi bidang dan konstruktor.Bidang
readonlytidak 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
readonlyjenis nilai tidak dapat diubah. - Karena jenis referensi berisi referensi ke datanya, bidang yang merupakan
readonlyjenis referensi harus selalu merujuk ke objek yang sama. Objek itu mungkin tidak dapat diubah. Pengubahreadonlymencegah 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 dan merupakan jenis referensi yang dapat diubah mungkin merupakan kerentanan keamanan dan dapat memicu peringatan CA2104: "Jangan deklarasikan jenis referensi yang dapat diubah sebagai baca-saja."
- Karena jenis nilai secara langsung berisi datanya, bidang yang merupakan
readonly structDalam definisi jenis,readonlymenunjukkan bahwa jenis struktur tidak dapat diubah. Untuk informasi selengkapnya, lihat bagianreadonlystruktur dari artikel Jenis struktur .Dalam deklarasi anggota instans dalam jenis struktur,
readonlymenunjukkan bahwa anggota instans tidak mengubah status struktur. Untuk informasi selengkapnya, lihatreadonlybagian anggota instans dari artikel Jenis struktur .ref readonlyDalam metode yang dikembalikan, pengubahreadonlymenunjukkan bahwa metode mengembalikan referensi dan tidak dapat melakukan penulisan pada referensi tersebut.- Untuk mendeklarasikan
ref readonlyparameter 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 readonly bidang hanya dalam konteks berikut:
Ketika variabel diinisialisasi 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. 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 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
Anda juga dapat menggunakan pengubah readonly untuk menyatakan bahwa anggota instans tidak mengubah status struct.
public readonly double Sum()
{
return X + Y;
}
Nota
Dalam kasus properti baca/tulis, Anda dapat menambahkan pengubah readonly ke aksesor get. 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 penggunaan ref, readonly, dan return
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 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 dapat dikembalikan oleh ref dapat dikembalikan oleh ref readonly.
Contoh pengembalian ref readonly dan return 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 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#.