Как дженерики C# влияют на коллекции с примитивами

Насколько я понимаю, дженерики C#/.Net поддерживают некоторую степень овеществления. Итак, если у меня есть следующий код:

List<int> list = new List<int>();
list.Add(1);

Будет ли значение 1 автоматически упаковано или объект 'list' будет эффективно обрабатывать примитивные целые числа?

4 ответа

Решение

Нет, это не будет в штучной упаковке. Во время выполнения резервный массив для List<int> будет действительно int[], Обратите внимание, что это относится не только к подлинным примитивным типам - List<T> не будет упаковывать значения любого типа значения (при условии, что оно было объявлено как List<Guid> и т. д., а не List<object>).

По сути, дженерики в.NET хранят гораздо больше своей информации, чем в Java - CLR изначально понимает дженерики и работает с ними надлежащим образом, а не в Java, где JVM практически ничего не знает о них.

Например, если вы напишите:

object list = new List<string>();
Type type = list.GetType();

затем type будет равен typeof(List<string>) - который тогда отличается от (скажем) List<Guid> и т.п.

int значения не будут упакованы в список. Это одна из красот с дженериками, что компилятор (точнее JIT-компилятор, я считаю) создаст типизированную версию List<> класс, а не хранить значения как object, Таким образом, он не только обеспечивает безопасность типов с помощью открытых методов и свойств, но и является подлинно типизированным во всех аспектах.

Как отмечали другие, джиттер генерирует новый код для каждой конструкции, включающей новый тип значения. Интересный момент, который еще не упоминался, заключается в том, что джиттер сгенерирует код один раз для построения ссылочного типа и повторно использует его для каждого ссылочного типа. Код для List<object> точно так же, как код для List<string>,

Это может показаться странным, но помните, что дженерики не являются шаблонами. К тому времени, как код для общего тела метода IL будет выдан, компилятор C# уже выполнит разрешение перегрузки и другой соответствующий семантический анализ.

Дженерики.NET становятся специализированными для структур, поэтому в вашем случае бокс не требуется. Обратите внимание, что в любом случае нет необходимости кастовать.

Другие вопросы по тегам