Упаковка и Распаковывание [дубликата]

5
задан Thorarin 5 June 2010 в 13:28
поделиться

4 ответа

Массив в C # является ссылочным типом, поэтому упаковка не требуется. Однако в этом примере у вас будет бокс:

var i = 123;
object o = i;
4
ответ дан 18 December 2019 в 06:49
поделиться

Если предположить, что это C# (var и C#-подобный синтаксис массивов), то нет, i не имеет рамки. Только примитивные типы значений (например, числовые значения) могут быть заключены в рамки.

Значения в массиве также не заключены в рамки, поскольку значения в примитивных массивах не заключаются в рамки.

7
ответ дан 18 December 2019 в 06:49
поделиться

Упаковка происходит только тогда, когда тип значения (то есть примитивный тип, структура или перечисление) обрабатывается как ссылочный тип. Ваш массив объявлен как содержащий значения типа int . Ключевое слово var просто указывает компилятору вывести тип переменной i , а не указывать его вручную.

Если бы вы написали:

var i = new object[2];

Компилятор преобразовал бы это в объект [] i = новый объект [2] , и любые введенные вами значения int будут заключены в рамку. . Любой ссылочный тип, который вы помещаете в тот же массив, не требует упаковки.

Короче говоря, var не имеет ничего общего с боксом.

Вот диаграмма различных типов в .NET. Вы также можете прочитать Основы .NET Type .

3
ответ дан 18 December 2019 в 06:49
поделиться

Нет, боксировать не за что. Ключевое слово var не означает, что переменная закреплена за рамками. Он не выполняет никаких преобразований во время выполнения. Ключевое слово var является строго конструкцией C #. Что на самом деле происходит, когда вы используете var:

var i = new int[1];

IL видит это как:

int[] i = new int[1]

Теперь, если вы спрашиваете, когда вы назначаете int для части массива i, он блокируется?

например:

i[0] = 2;

Нет, это не так.

Это противоположно тому, что делает:

var o = new object[1];

o[0] = 2;

Этот пример делает, и почему использование ArrayList (думаю, расширяемый массив) в версиях 1.0, 1.1 (до дженериков) стоило огромных затрат. Следующий комментарий относится и к примеру объекта [] :

Любая ссылка или тип значения, который является добавлен в ArrayList неявно преобразование в объект. Если предметы типы значений, они должны быть упакованы, когда добавлен в список и распакован, когда они извлекаются. Оба кастинга и операции упаковки и распаковки ухудшить производительность; эффект бокс и распаковка могут быть довольно важно в сценариях, где вы должен перебирать большие коллекции.

Ссылка MSDN на ArrayList

Ссылка на бокс в C #

9
ответ дан 18 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: