C# membagi seluruh tipe ke dua keluarga: value type dan reference type. Pembagian tersebut menentukan isi sebuah variable: salinan data secara langsung, atau alamat menuju object. Perilaku assignment dan penyalinan data bergantung penuh pada keluarga tipe variable, sehingga perbedaan ini menjadi fondasi sebelum masuk ke bab object dan boxing.
Value Type: Variable Menyimpan Nilai Langsung #
Semua tipe numerik, bool, char, dan struct lain termasuk value type. Variable value type berisi data secara langsung, dan slot datanya umumnya tersimpan di stack, area memori yang dikelola otomatis mengikuti alur pemanggilan. Assignment antar value type menyalin isi data, sehingga dua variable berdiri sendiri setelah penyalinan.
int nilaiA = 5;
int nilaiB = nilaiA;
nilaiB = 20;
Console.WriteLine(nilaiA);Output yang Dihasilkan:
5Mari kita telaah:
- Baris 1 (
int nilaiA = 5;): SlotnilaiAberisi nilai5. - Baris 2 (
int nilaiB = nilaiA;): Runtime menyalin isinilaiA, bukan menghubungkan kedua variable; slotnilaiBkini berisi5tersendiri. - Baris 3 (
nilaiB = 20;): Perubahan hanya menyentuh slotnilaiB. - Baris 5:
nilaiAtetap5karena salinan kedua variable berdiri sendiri.
Reference Type: Variable Menyimpan Alamat #
string, object, array, dan semua class termasuk reference type. Variable reference type tidak menyimpan data langsung; variable menyimpan reference, yaitu alamat menuju object yang tersimpan di heap. Assignment menyalin alamat, sehingga dua variable dapat menunjuk object yang sama. Sebagai perwakilan reference type, contoh berikut memakai array int[] — kumpulan beberapa nilai dalam satu variable. Sintaks lengkap array dibahas pada section tersendiri; di sini cukup amati perilaku penyalinannya.
int[] angkaA = { 1, 2, 3 };
int[] angkaB = angkaA;
angkaB[0] = 99;
Console.WriteLine(angkaA[0]);Output yang Dihasilkan:
99Mari kita telaah:
- Baris 1 (
int[] angkaA = { 1, 2, 3 };): Runtime membuat satu object array di heap berisi1, 2, 3; variableangkaAmenyimpan alamat object tersebut. - Baris 2 (
int[] angkaB = angkaA;): Yang tersalin hanya alamat, bukan isi array;angkaAdanangkaBkini menunjuk object yang sama. - Baris 3 (
angkaB[0] = 99;): Perubahan lewatangkaBmenyentuh object yang sama dengan yang dirujukangkaA. - Baris 5: Pembacaan lewat
angkaAmenampilkan99— bukti kedua variable berbagi satu object.
Tabel Perbandingan #
| Aspek | Value Type | Reference Type |
|---|---|---|
| Isi variable | Nilai data langsung | Alamat (reference) menuju object |
| Penyimpanan utama | Stack | Heap |
| Hasil assignment | Salinan data berdiri sendiri | Dua variable menunjuk object yang sama |
| Contoh tipe | int, double, bool, char, decimal | string, object, array, semua class |