Общие списки хранятся в стеке или куче в 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>
он может только удерживать int
s и бокс не происходит. Бокс происходит, если необходимо обработать тип значения как ссылочный тип.
нет понятия "куча" или "стек" при создании объектов в C# или .Сеть. Хотя список хранится в куче, это действительно деталь реализации того, как среда CLR управляет своей памятью.
здесь нет бокса или распаковки. Это преимущество использования generic List
класс над неродовым ArrayList
. Когда новый экземпляр List<int>
создается, это как если бы вы написали класс с единственной целью управления списком int
. Нет даже любой кастинг происходит за кулисами, когда int
извлекается из списка.
для таких структур, как int
, общий список становится специализированным, и поэтому не требуется бокс/распаковка.
обратите внимание, что сами значения хранятся в массиве поддержки List
тем не менее.