Section Fungsi dan Method membahas ref sebagai parameter: variabel milik pemanggil diteruskan sebagai referensi. Bab ini melangkah ke dua bentuk lain: ref local, yaitu variable lokal yang menjadi alias sebuah lokasi memori, dan ref return, yaitu method yang mengembalikan referensi ke elemen data milik pemanggil. Kombinasi keduanya memungkinkan kita memutakhirkan satu elemen array tanpa menyalin apa pun.
Mekanisme Alias #
return ref data[i] tidak mengembalikan salinan nilai, melainkan alias ke lokasi elemen array. Pemanggil yang ingin menampungnya wajib membentuk ref local dengan penulisan ref int x = ref ...; dari titik itu, setiap pembacaan dan penulisan pada x bekerja langsung di lokasi asalnya. Pola ini dipakai banyak API performa tinggi, misalnya indexer Span<T> yang mengembalikan ref T.
Contoh: Memutakhirkan Elemen Terbesar #
static ref int NilaiTerbesar(int[] data)
{
int indeks = 0;
for (int i = 1; i < data.Length; i++)
{
if (data[i] > data[indeks]) indeks = i;
}
return ref data[indeks];
}
int[] skor = { 65, 92, 78 };
ref int terbesar = ref NilaiTerbesar(skor);
Console.WriteLine(terbesar);
terbesar = 100;
Console.WriteLine(skor[1]);
ref int elemen = ref skor[2];
elemen += 5;
Console.WriteLine(skor[2]);
ref readonly int pertama = ref skor[0];
Console.WriteLine(pertama);Output yang Dihasilkan:
92
100
83
65Mari kita bedah baris demi baris:
return ref data[indeks]: method mengembalikan alias ke elemen array, bukan salinan nilainya; tandarefwajib muncul pada return type dan pada expression kembalian.ref int terbesar = ref NilaiTerbesar(skor);: ref local menampung alias tersebut; katarefditulis dua kali karena deklarasi dan sumber alias sama-sama harus dinyatakan.terbesar = 100;: penugasan menulis ke lokasi asal, sehinggaskor[1]yang tadinya92berubah menjadi100.ref int elemen = ref skor[2];: alias tidak hanya untuk hasil method; elemen array pun dapat dialokalkan, danelemen += 5menaikkanskor[2]menjadi83.ref readonly int pertama: bentuk baca-saja menjamin variable ini tidak dipakai menulis; penugasan kepertamaditolak compiler.
Batas yang Ditegakkan Compiler #
Referensi tidak boleh menunjuk memori yang rentannya sudah tidak berlaku. Method tidak boleh return ref ke variable lokal miliknya sendiri, dan ref local tidak boleh dialokasikan ke lokasi yang rentang hidupnya lebih pendek. Aturan escape ini diperketat lebih lanjut oleh modifier scoped yang dibahas pada bab berikutnya.