Di .Net:
Seringkali Anda tidak dapat bergantung pada jenis variabel yang akan dikonsumsi suatu fungsi, jadi Anda perlu menggunakan variabel objek yang memanjang dari penyebut umum terendah - di .Net ini object.
Namun objectadalah kelas dan menyimpan isinya sebagai referensi.
List<int> notBoxed = new List<int> { 1, 2, 3 };
int i = notBoxed[1]; // this is the actual value
List<object> boxed = new List<object> { 1, 2, 3 };
int j = (int) boxed[1]; // this is an object that can be 'unboxed' to an int
Meskipun keduanya memiliki informasi yang sama, daftar kedua lebih besar dan lebih lambat. Setiap nilai dalam daftar kedua sebenarnya adalah referensi ke objectyang memiliki int.
Ini disebut kotak karena intdibungkus oleh object. Ketika dilemparkan kembali, intkotaknya tidak - dikonversi kembali ke nilainya.
Untuk tipe nilai (yaitu semua structs) ini lambat, dan berpotensi menggunakan lebih banyak ruang.
Untuk tipe referensi (yaitu semua classes), ini jauh dari masalah, karena mereka tetap disimpan sebagai referensi.
Masalah lebih lanjut dengan tipe nilai kotak adalah bahwa tidak jelas bahwa Anda berurusan dengan kotak, bukan nilai. Ketika Anda membandingkan dua structsmaka Anda membandingkan nilai, tetapi ketika Anda membandingkan dua classeslalu (secara default) Anda membandingkan referensi - yaitu apakah ini contoh yang sama?
Ini bisa membingungkan ketika berhadapan dengan tipe nilai kotak:
int a = 7;
int b = 7;
if(a == b) // Evaluates to true, because a and b have the same value
object c = (object) 7;
object d = (object) 7;
if(c == d) // Evaluates to false, because c and d are different instances
Sangat mudah untuk dikerjakan:
if(c.Equals(d)) // Evaluates to true because it calls the underlying int's equals
if(((int) c) == ((int) d)) // Evaluates to true once the values are cast
Namun itu adalah hal lain yang harus diperhatikan ketika berhadapan dengan nilai-nilai kotak.