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 kunci | Pemanggil wajib mengisi lebih dulu | Method boleh membaca | Method wajib mengisi |
|---|---|---|---|
ref | Ya | Ya | Tidak diwajibkan |
out | Tidak | Hanya setelah diisi | Ya, sebelum return |
in | Ya | Ya, hanya baca | Tidak diwajibkan |
Contoh Lengkap #
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:
Poin: 15
Ganda: 14
Tanpa kata kunci: 14
Rata: False, hasil bagi 3, sisa 1Mari kita bedah bagian demi bagian:
- Baris 21-23 (
ref):poindiisi5sebelum dipanggil;NaikkanSepuluhmenambah10pada variabel yang sama, sehingga setelah panggilanpoinbernilai15. Modifierrefwajib ditulis di pemanggil. - Baris 26-27 (
in):Gandakanhanya membacaangka; hasilnya tetap14. Pada baris 27, kata kunciinsengaja tidak ditulis untuk membuktikan bahwa modifier ini opsional di titik pemanggilan. - Baris 29 (
out): dua variabelhasilBagidansisadideklarasikan langsung di dalam baris panggilan (inline); method mengisi keduanya pada baris 15-16 sebelumreturn. - Baris 30:
10tidak habis dibagi3, sehingga method mengembalikanFalse, dengan hasil bagi3dan sisa1— 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.