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.

csharp
int nilaiA = 5;
int nilaiB = nilaiA;
nilaiB = 20;

Console.WriteLine(nilaiA);

Output yang Dihasilkan:

text
5

Mari kita telaah:

  1. Baris 1 (int nilaiA = 5;): Slot nilaiA berisi nilai 5.
  2. Baris 2 (int nilaiB = nilaiA;): Runtime menyalin isi nilaiA, bukan menghubungkan kedua variable; slot nilaiB kini berisi 5 tersendiri.
  3. Baris 3 (nilaiB = 20;): Perubahan hanya menyentuh slot nilaiB.
  4. Baris 5: nilaiA tetap 5 karena 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.

csharp
int[] angkaA = { 1, 2, 3 };
int[] angkaB = angkaA;
angkaB[0] = 99;

Console.WriteLine(angkaA[0]);

Output yang Dihasilkan:

text
99

Mari kita telaah:

  1. Baris 1 (int[] angkaA = { 1, 2, 3 };): Runtime membuat satu object array di heap berisi 1, 2, 3; variable angkaA menyimpan alamat object tersebut.
  2. Baris 2 (int[] angkaB = angkaA;): Yang tersalin hanya alamat, bukan isi array; angkaA dan angkaB kini menunjuk object yang sama.
  3. Baris 3 (angkaB[0] = 99;): Perubahan lewat angkaB menyentuh object yang sama dengan yang dirujuk angkaA.
  4. Baris 5: Pembacaan lewat angkaA menampilkan 99 — bukti kedua variable berbagi satu object.

Tabel Perbandingan #

AspekValue TypeReference Type
Isi variableNilai data langsungAlamat (reference) menuju object
Penyimpanan utamaStackHeap
Hasil assignmentSalinan data berdiri sendiriDua variable menunjuk object yang sama
Contoh tipeint, double, bool, char, decimalstring, object, array, semua class