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 #

csharp
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:

text
92
100
83
65

Mari kita bedah baris demi baris:

  1. return ref data[indeks]: method mengembalikan alias ke elemen array, bukan salinan nilainya; tanda ref wajib muncul pada return type dan pada expression kembalian.
  2. ref int terbesar = ref NilaiTerbesar(skor);: ref local menampung alias tersebut; kata ref ditulis dua kali karena deklarasi dan sumber alias sama-sama harus dinyatakan.
  3. terbesar = 100;: penugasan menulis ke lokasi asal, sehingga skor[1] yang tadinya 92 berubah menjadi 100.
  4. ref int elemen = ref skor[2];: alias tidak hanya untuk hasil method; elemen array pun dapat dialokalkan, dan elemen += 5 menaikkan skor[2] menjadi 83.
  5. ref readonly int pertama: bentuk baca-saja menjamin variable ini tidak dipakai menulis; penugasan ke pertama ditolak 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.