Call By Value Dan Call By Reference Di C#: Pengertian, Perbedaan, Dan Contohnya

Call By Value Dan Call By Reference Di C#: Pengertian, Perbedaan, Dan Contohnya

cs.bimobo
0

Call By Value Dan Call By Reference Di C#, Kelihatannya Mirip, Tapi Bisa Bikin Pusing Kalau Salah Paham

Kalau Anda baru belajar C#, ada satu topik yang kelihatannya sederhana tapi sering bikin kepala miring sedikit: Call By Value dan Call By Reference. Namanya terdengar akademis, tapi efeknya sangat nyata. Salah paham sedikit, variabel bisa tidak berubah saat Anda berharap berubah. Atau lebih seru lagi, object berubah diam-diam padahal Anda merasa tadi cuma “kirim data doang”.
Masalahnya, banyak orang mengira kalau sebuah object dikirim ke method, berarti otomatis itu pass by reference. Nah, di sinilah jebakannya. C# itu cukup licik tapi tetap konsisten. Secara default, argumen di C# dikirim by value. Bedanya, kalau yang dikirim adalah value type, yang disalin adalah nilainya. Kalau yang dikirim reference type, yang disalin adalah referensinya. Jadi sama-sama by value, cuma isi yang disalin berbeda. Dan di titik ini biasanya separuh kelas mulai mengucek dahi.
Biar tidak terasa seperti sedang membaca mantra compiler, mari kita bahas dengan cara yang lebih manusiawi, sedikit jenaka, tapi tetap rapi.

📦 Apa Itu Call By Value?

Call By Value berarti method menerima salinan dari argumen yang dikirim. Jadi yang dimainkan oleh method itu bukan variabel asli milik pemanggil, melainkan fotokopinya.
Kalau variabel aslinya seperti uang asli di dompet, maka yang masuk ke method adalah uang mainan hasil fotokopi. Bentuknya mirip, angkanya sama, tapi kalau dicoret-coret di dalam method, dompet asli Anda tetap aman.
C#

using System;

class Program
{
    static void UbahAngka(int angka)
    {
        angka = 99;
        Console.WriteLine($"Di Dalam Method: {angka}");
    }

    static void Main()
    {
        int nilai = 10;
        UbahAngka(nilai);

        Console.WriteLine($"Di Luar Method: {nilai}");
    }
}

  
Kalau kode di atas dijalankan, nilai di dalam method berubah menjadi 99, tapi variabel nilai di luar method tetap 10. Kenapa? Karena method hanya mengubah salinan, bukan sumber aslinya.

🪨 Value Type: Perubahan Berhenti Di Dalam Method

Tipe seperti int, double, bool, dan struct termasuk kategori value type. Variabel value type secara langsung menyimpan datanya. Jadi saat dikirim ke method biasa, datanya benar-benar disalin. Bukan dipinjam, bukan dititip, tapi disalin seperti tugas sekolah teman yang katanya “cuma buat referensi”.
Karena itu, perubahan pada parameter tidak akan mengubah variabel asli milik pemanggil. Aman, jelas, dan kadang bikin frustasi kalau Anda tadinya berharap nilainya ikut berubah.

🧍 Reference Type: Nah, Bagian Ini Yang Sering Menjebak

Sekarang masuk ke bagian yang sering bikin orang berkata, “Lho, katanya by value, kok object-nya berubah?” Tenang, Anda tidak sendirian. Ini adalah lubang jebakan favorit dunia C#.
Untuk reference type seperti class, yang dikirim ke method memang masih by value. Tapi yang disalin bukan isi object-nya, melainkan referensinya. Jadi method dan pemanggil sama-sama menunjuk ke object yang sama. Akibatnya, isi object bisa diubah dari dalam method. Yang tidak bisa diubah secara otomatis adalah arah variabel pemanggil ke object lain.
C#

using System;

class Pegawai
{
    public string Nama { get; set; }
}

class Program
{
    static void UbahNama(Pegawai pegawai)
    {
        pegawai.Nama = "Budi";
    }

    static void Main()
    {
        Pegawai data = new Pegawai { Nama = "Andi" };
        UbahNama(data);

        Console.WriteLine(data.Nama);
    }
}

  
Output-nya akan menjadi Budi. Ini bukan berarti object dikirim by reference secara otomatis. Yang benar: referensi ke object itu disalin, lalu salinannya tetap menunjuk ke object yang sama. Jadi kalau properti object diubah, perubahan terlihat juga dari luar.

🚪 Kenapa Object Bisa Diubah, Tapi Tidak Bisa Diganti Seenaknya?

Coba perhatikan contoh berikut. Di sini kita tidak mengubah isi object lama, tapi malah mencoba membuat object baru di dalam method.
C#

using System;

class Pegawai
{
    public string Nama { get; set; }
}

class Program
{
    static void GantiObject(Pegawai pegawai)
    {
        pegawai = new Pegawai { Nama = "Siti" };
    }

    static void Main()
    {
        Pegawai data = new Pegawai { Nama = "Andi" };
        GantiObject(data);

        Console.WriteLine(data.Nama);
    }
}

  
Hasilnya tetap Andi. Kenapa? Karena yang diganti hanya salinan referensinya di dalam method. Variabel data di luar method masih menunjuk ke object lama. Jadi analoginya begini: Anda memberi teman salinan alamat rumah. Dia boleh mengecat rumah yang alamatnya sama. Tapi kalau dia pindah ke rumah baru, Anda tidak otomatis ikut pindah.

🔁 Lalu Apa Itu Call By Reference?

Nah, kalau Anda memang ingin method bisa benar-benar mengubah variabel milik pemanggil, Anda perlu memakai ref, out, atau dalam kasus baca-saja, in. Untuk contoh paling umum, kita pakai ref.
Dengan ref, parameter tidak lagi bekerja pada salinan biasa. Method benar-benar memegang referensi ke variabel pemanggil. Jadi kalau nilainya diubah, perubahan itu akan terlihat dari luar. Tidak lagi sekadar fotokopi, tapi langsung pegang dokumen aslinya.
C#

using System;

class Program
{
    static void UbahLangsung(ref int angka)
    {
        angka = 99;
    }

    static void Main()
    {
        int nilai = 10;
        UbahLangsung(ref nilai);

        Console.WriteLine(nilai);
    }
}

  
Sekarang output-nya benar-benar 99. Karena kali ini yang masuk ke method bukan sekadar salinan nilai, tapi akses langsung ke variabel aslinya.

🧠 Cara Paling Aman Mengingatnya

Kalau Anda sering tertukar, ingat rumus singkat ini:
  • Value Type + Method Biasa = Yang Disalin Adalah Nilainya
  • Reference Type + Method Biasa = Yang Disalin Adalah Referensinya
  • ref / out / in = Ada Modifier Khusus Untuk Perilaku By Reference
Kalimat yang paling aman untuk diingat adalah ini: Reference Type Bukan Berarti Otomatis Pass By Reference. Ini salah paham paling populer dan paling rajin muncul di forum, kelas, dan kepala programmer pemula.

☕ Contoh Dunia Nyata Supaya Tidak Terasa Teoretis

Bayangkan Anda punya aplikasi kasir. Ada method untuk menghitung diskon dan ada object Pelanggan yang menyimpan nama serta poin loyalitas.
  • Kalau Anda kirim int totalBelanja ke method biasa, lalu nilainya diubah di dalam method, total asli di luar tidak ikut berubah.
  • Kalau Anda kirim object Pelanggan, lalu poin pelanggan ditambah di dalam method, object asli bisa ikut berubah karena method dan pemanggil menunjuk ke object yang sama.
  • Kalau Anda ingin method benar-benar bisa mengganti variabel pelanggan ke object pelanggan baru, Anda butuh ref.
Jadi di dunia nyata, topik ini bukan sekadar teori kampus. Ini menentukan apakah data Anda berubah seperti yang diharapkan atau malah membuat Anda menatap debugger sambil bertanya, “Kenapa hasilnya begini?”

📌 Kesimpulan

Call By Value Dan Call By Reference di C# memang kelihatannya mirip, tapi perilakunya berbeda cukup jauh. Secara default, C# mengirim argumen by value. Untuk value type, yang disalin adalah nilai. Untuk reference type, yang disalin adalah referensi. Karena itu, isi object bisa berubah, tetapi variabel pemanggil tidak otomatis bisa diarahkan ke object lain.
Kalau Anda ingin method benar-benar bekerja langsung pada variabel asli milik pemanggil, gunakan modifier seperti ref. Dan kalau Anda mulai merasa topik ini agak menjebak, tenang saja. Itu wajar. Banyak programmer juga pernah tertipu oleh kalimat “reference type” lalu mengira semuanya otomatis pass by reference. Ternyata hidup tidak semudah itu.
Yang penting, setelah memahami konsep ini, Anda akan lebih tenang saat mengirim data ke method, dan lebih jarang menyalahkan compiler atas hal yang sebenarnya dilakukan dengan sangat konsisten.

📣 Lanjut Ke Topik Yang Sering Ikut Bikin Bingung

Setelah paham Call By Value Dan Call By Reference, langkah berikutnya yang menarik untuk dibahas adalah perbedaan ref, out, dan in di C#. Tiga keyword ini kecil, tapi efeknya cukup besar untuk perilaku method dan data.

Baca Lanjut

🏷️ Tags: C# Call By Value Call By Reference ref Value Type Reference Type Pemrograman Dasar

Posting Komentar

0 Komentar

Posting Komentar (0)
3/related/default