«Хранение» типов значений внутри ArrayList - PullRequest
7 голосов
/ 01 декабря 2011

Класс ArrayList может содержать только ссылки на объекты, но что происходит при сохранении типа значения, такого как целые числа?

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?

Ответы [ 4 ]

12 голосов
/ 01 декабря 2011

Это называется «бокс»: автоматически int преобразуется в ссылочный тип.Это стоит некоторой производительности.

См. Также Бокс и распаковка .

2 голосов
/ 01 декабря 2011

Если вы откроете класс ArrayList в ILSpy, вы увидите, что резервное хранилище:

private object[] _items;

и что метод Add принимает экземпляр типа object:

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

Поэтому, когда вы вызываете Add с целым числом, .NET вставляет целое число, а затем оно добавляется к массиву _items в ArrayList как object.

Кстати, если вам нужно ArrayList только целых чисел и вы используете .NET 2.0 Framework или более позднюю версию, вам следует использовать класс List (он же универсальный список), который будет работать лучше, так как при этом не требуется указывать int при сохранении или извлечении его из списка (см. раздел «Вопросы производительности» в этой последней ссылке).

1 голос
/ 01 декабря 2011

Это называется боксом. «Коробка» содержит копию структуры вместе с деталями ее типа.

MSDN: http://msdn.microsoft.com/en-us/library/yz2be5wk%28v=vs.80%29.aspx

В фреймворке 2.0 + корпорация Майкрософт дала нам генерики, которые работают быстрее и эффективнее:

MSDN: http://msdn.microsoft.com/en-us/library/ms172192.aspx

0 голосов
/ 01 декабря 2011

Arraylist.Add () добавит, примет любое значение и добавится как объект, поэтому целочисленное значение будет автоматически преобразовано (в бокс) и добавлено в массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...