Secara default, C# menyalin nilai argument ke parameternya. Ketika method NaikkanSepuluh mengubah parameternya, variabel milik pemanggil tetap tidak berubah, karena yang berubah hanyalah salinannya. Kata kunci ref, out, dan in mengubah kontrak tersebut: variabel milik pemanggil diteruskan sebagai referensi, sehingga method bekerja langsung pada variabel aslinya.

Perbandingan Tiga Kata Kunci #

Kata kunciPemanggil wajib mengisi lebih duluMethod boleh membacaMethod wajib mengisi
refYaYaTidak diwajibkan
outTidakHanya setelah diisiYa, sebelum return
inYaYa, hanya bacaTidak diwajibkan

Contoh Lengkap #

csharp
static class Skor
{
    public static void NaikkanSepuluh(ref int nilai)
    {
        nilai += 10;
    }

    public static int Gandakan(in int angka)
    {
        return angka * 2;
    }

    public static bool CobaBagiRata(int total, int porsi, out int hasilBagi, out int sisa)
    {
        hasilBagi = total / porsi;
        sisa = total % porsi;
        return sisa == 0;
    }
}

int poin = 5;
Skor.NaikkanSepuluh(ref poin);
Console.WriteLine($"Poin: {poin}");

int angka = 7;
Console.WriteLine($"Ganda: {Skor.Gandakan(in angka)}");
Console.WriteLine($"Tanpa kata kunci: {Skor.Gandakan(angka)}");

bool rata = Skor.CobaBagiRata(10, 3, out int hasilBagi, out int sisa);
Console.WriteLine($"Rata: {rata}, hasil bagi {hasilBagi}, sisa {sisa}");

Output yang Dihasilkan:

text
Poin: 15
Ganda: 14
Tanpa kata kunci: 14
Rata: False, hasil bagi 3, sisa 1

Mari kita bedah bagian demi bagian:

  1. Baris 21-23 (ref): poin diisi 5 sebelum dipanggil; NaikkanSepuluh menambah 10 pada variabel yang sama, sehingga setelah panggilan poin bernilai 15. Modifier ref wajib ditulis di pemanggil.
  2. Baris 26-27 (in): Gandakan hanya membaca angka; hasilnya tetap 14. Pada baris 27, kata kunci in sengaja tidak ditulis untuk membuktikan bahwa modifier ini opsional di titik pemanggilan.
  3. Baris 29 (out): dua variabel hasilBagi dan sisa dideklarasikan langsung di dalam baris panggilan (inline); method mengisi keduanya pada baris 15-16 sebelum return.
  4. Baris 30: 10 tidak habis dibagi 3, sehingga method mengembalikan False, dengan hasil bagi 3 dan sisa 1 — dua keluaran tambahan selain return value.

Pola out pada CobaBagiRata lazim dipakai method yang melaporkan keberhasilan sekaligus mengirim hasilnya, seperti int.TryParse yang sudah kita singgung pada section Input dan Output. Adapun in paling bermanfaat pada struct berukuran besar: data tidak disalin ulang, dan compiler menegakkan larangan perubahan di dalam method.