Net olarak:
Genellikle bir işlevin ne tür bir değişken kullanacağına güvenemezsiniz, bu nedenle en düşük ortak paydadan - in .net bu kadar uzanan bir nesne değişkeni kullanmanız gerekir object
.
Ancak object
bir sınıftır ve içeriğini referans olarak saklar.
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
Her ikisi de aynı bilgileri tutarken, ikinci liste daha büyük ve daha yavaştır. İkinci listede her bir değer aslında bir başvurusudur object
tutar int
.
Bunun nedeni kutulu denir int
tarafından sarılır object
. Geri alındığında int
kutusuzdur - değerine geri dönüştürülür.
Değer türleri (yani tümü structs
) için bu yavaştır ve potansiyel olarak çok daha fazla alan kullanır.
Referans türleri (yani tümü classes
) için, yine de referans olarak saklandıklarından, bu çok daha az problemdir.
Kutulu bir değer türüyle ilgili başka bir sorun da, değerden ziyade kutuyla uğraştığınız açık değildir. Eğer ikisini karşılaştırdığımızda structs
o zaman değerlerini karşılaştırarak yapıyor ancak ikisini karşılaştırdığımızda classes
(varsayılan olarak) o zaman referansı kıyaslıyorsun - yani bu aynı örneği vardır?
Kutulu değer türleriyle uğraşırken bu kafa karıştırıcı olabilir:
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
Etrafında çalışmak kolaydır:
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
Ancak kutulu değerlerle uğraşırken dikkatli olmak başka bir şeydir.