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 object
adalah 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 object
yang memiliki int
.
Ini disebut kotak karena int
dibungkus oleh object
. Ketika dilemparkan kembali, int
kotaknya 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 structs
maka Anda membandingkan nilai, tetapi ketika Anda membandingkan dua classes
lalu (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.