Как дженерики 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 становятся специализированными для структур, поэтому в вашем случае бокс не требуется. Обратите внимание, что в любом случае нет необходимости кастовать.