Общие списки хранятся в стеке или куче в C #? - PullRequest
7 голосов
/ 13 сентября 2010

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

пример

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

Хранится ли myInts в стеке или куче?Если я добавлю int в список, произойдет ли бокс или распаковка?

Ответы [ 3 ]

6 голосов
/ 13 сентября 2010

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

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

4 голосов
/ 13 сентября 2010

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

0 голосов
/ 13 сентября 2010

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

Обратите внимание, что сами значения сохраняются в резервном массиве List.

...