2011-12-01 19 views
7

ArrayList sınıfı yalnızca nesneler için başvurular içerebilir, ancak tamsayılar gibi bir değer türünü depoladığınızda ne olur?"ArrayList" içindeki değer türlerini kaydetme

string str = "Hello"; 
int i = 50; 

ArrayList arraylist = new ArrayList(); 

arraylist.Add(str); // Makes perfectly sense: 
        // Reference to string-object (instance) "Hello" is added to 
        // index number 0 

arraylist.Add(i); // What happens here? How can a reference point to a value 
        // type? Is the value type automatically converted to an 
        // object and thereafter added to the ArrayList? 
+0

olası yinelenen [nasıl NET'te "boks" iş? ] (http://stackoverflow.com/questions/5997398/how-does-boxing-work-in-net) –

+5

Gerçekten değil - Bu sorunun cevabını zaten biliyor olsaydınız ikisinin de yalnızca ilgili olduğunu biliyordunuz. – mavnn

+1

@Binary worrier - Aynı konu, ama sonra nasıl adlandırıldığını bilmeniz gerekiyor .. –

cevap

12

"Boxing" olarak adlandırılır: automagically int, bir referans türüne dönüştürülür. Bu biraz performansa mal olur.

Ayrıca bkz. Boxing and Unboxing.

0

Arraylist.Add(), herhangi bir değer ekler ve bir nesne olarak ekler, böylece tamsayı değeri otomatik olarak dönüştürülür (boks) ve arraylist'e eklenir. Eğer ILSpy içinde ArrayList sınıfını çekersem

2

, sen yedekleme deposu olduğunu göreceksiniz:

private object[] _items; 

ve Add yöntem türü object bir örneğini kabul ettiğini:

public virtual int Add(object value) { ... } 

Böylece bir tamsayı ile Add'u aradığınızda, .NET boxes tamsayıdır ve object olarak _items dizisine eklenir. . Sadece tamsayılar ArrayList ihtiyaç ve daha sonra .NET 2.0 Framework kullanarak veya eğer

arada, bunu bir boks zorunluluğunu ortadan kaldırdığı beri iyi performans göstereceği, hangi yerine List<T> (aka jenerik Liste) sınıfını kullanmalıdır int listeden saklarken veya çıkarırken (bu son bağlantıdaki Performans Konuları bölümüne bakın).