Bab Object dan Dynamic menunjukkan bahwa satu variable object dapat menampung nilai tipe apa pun, termasuk value type seperti int. Apa sebenarnya yang terjadi di memori ketika nilai value type masuk ke object? Jawabannya: boxing — dan proses berlawanannya bernama unboxing.
Boxing: Nilai Dikemas ke Heap #
int nomorPesanan = 12345;
object kotak = nomorPesanan;
Console.WriteLine(kotak);
Console.WriteLine(kotak.GetType());
nomorPesanan = 67890;
Console.WriteLine(kotak);
int kembali = (int)kotak;
Console.WriteLine(kembali);Output yang Dihasilkan:
12345
System.Int32
12345
12345Mari kita telaah baris demi baris:
- Baris 1 (
int nomorPesanan = 12345;): Value type biasa; nilainya tersimpan langsung pada slot variable. - Baris 2 (
object kotak = nomorPesanan;): Di sinilah boxing terjadi. Runtime mengalokasikan object baru di heap, menyalin nilai12345ke dalam object tersebut, lalu variablekotakmenyimpan alamatnya. - Baris 4-5: Object dicetak dan
GetType()melaporkanSystem.Int32— tipe asli nilai ikut tercatat pada object hasil boxing. - Baris 7 (
nomorPesanan = 67890;): Perubahan hanya menyentuh variable asal. - Baris 8: Kotak tetap menampilkan
12345; bukti bahwa boxing menyalin nilai, bukan menghubungkan kedua penyimpanan. - Baris 10-11 (
(int)kotak): Unboxing mengambil salinan nilai kembali ke value type; cast eksplisit(int)wajib ditulis.
Boxing berjalan otomatis; unboxing tidak. Compiler menuntut cast eksplisit karena runtime memeriksa tipe object secara persis: object harus benar-benar berisi System.Int32 agar boleh di-unboxing ke int. Object berisi tipe lain memicu exception; contoh kegagalannya dibahas pada bab Type Casting.
Biaya Boxing #
Setiap boxing membuat object baru di heap beserta salinan nilainya; setiap unboxing menyalin kembali ke slot value type. Pada operasi yang berulang banyak kali, alokasi dan penyalinan ini menumpuk dan menambah beban garbage collector. Struktur data generik seperti List<T> — dibahas pada section koleksi — dirancang untuk menampung value type tanpa boxing.
Boxing juga dapat terjadi tanpa terlihat ketika nilai value type masuk ke API yang menerima object. Salah satunya overload Console.WriteLine(object value) yang sudah kita pakai sepanjang course ini. Karena prosesnya tak terlihat di kode, membiasakan diri memperhatikan tipe variable sejak deklarasi membantu memperkirakan kapan boxing berlangsung.