Массив в C # является ссылочным типом, поэтому упаковка не требуется. Однако в этом примере у вас будет бокс:
var i = 123;
object o = i;
Если предположить, что это C# (var
и C#-подобный синтаксис массивов), то нет, i
не имеет рамки. Только примитивные типы значений (например, числовые значения) могут быть заключены в рамки.
Значения в массиве также не заключены в рамки, поскольку значения в примитивных массивах не заключаются в рамки.
Упаковка происходит только тогда, когда тип значения (то есть примитивный тип, структура или перечисление) обрабатывается как ссылочный тип. Ваш массив объявлен как содержащий значения типа int
. Ключевое слово var
просто указывает компилятору вывести тип переменной i
, а не указывать его вручную.
Если бы вы написали:
var i = new object[2];
Компилятор преобразовал бы это в объект [] i = новый объект [2]
, и любые введенные вами значения int
будут заключены в рамку. . Любой ссылочный тип, который вы помещаете в тот же массив, не требует упаковки.
Короче говоря, var
не имеет ничего общего с боксом.
Вот диаграмма различных типов в .NET. Вы также можете прочитать Основы .NET Type .
Нет, боксировать не за что. Ключевое слово 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 неявно преобразование в объект. Если предметы типы значений, они должны быть упакованы, когда добавлен в список и распакован, когда они извлекаются. Оба кастинга и операции упаковки и распаковки ухудшить производительность; эффект бокс и распаковка могут быть довольно важно в сценариях, где вы должен перебирать большие коллекции.