Как дженерики C # влияют на коллекции с примитивами - PullRequest
10 голосов
/ 18 сентября 2010

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

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

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

Ответы [ 4 ]

20 голосов
/ 18 сентября 2010

Нет, это не будет в штучной упаковке.Во время выполнения резервный массив для 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> и т. Д.

5 голосов
/ 18 сентября 2010

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

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

5 голосов
/ 18 сентября 2010

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

3 голосов
/ 18 сентября 2010

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

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