Общие списки хранятся в стеке или куче в C#?

общие списки хранятся в стеке или куче?

пример

//List of Ints
List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(20);

Is myInts хранится в стеке или куче? Если я добавлю int в списке происходит ли бокс или распаковка?

3 ответов


List<T> является ссылочным типом. Внутренне он использует T[]. Массив является ссылочным типом. Экземпляры ссылочных типов хранятся в куче. Поскольку список в вашем примере это List<int> он может только удерживать ints и бокс не происходит. Бокс происходит, если необходимо обработать тип значения как ссылочный тип.


нет понятия "куча" или "стек" при создании объектов в C# или .Сеть. Хотя список хранится в куче, это действительно деталь реализации того, как среда CLR управляет своей памятью.

здесь нет бокса или распаковки. Это преимущество использования generic List класс над неродовым ArrayList. Когда новый экземпляр List<int> создается, это как если бы вы написали класс с единственной целью управления списком int. Нет даже любой кастинг происходит за кулисами, когда int извлекается из списка.


для таких структур, как int, общий список становится специализированным, и поэтому не требуется бокс/распаковка.

обратите внимание, что сами значения хранятся в массиве поддержки List тем не менее.