Как C# словарь переменной хранится в памяти? - PullRequest
0 голосов
/ 30 января 2020

Может кто-нибудь объяснить, как C# словарь хранится в памяти? Я знаю, что в C# управление памятью осуществляется с помощью кучи и стека. Но я действительно не мог найти простое объяснение того, как выделяется память при создании словарной переменной, она создается в кадре стека или в куче?

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Во-первых, вы должны быть очень ясно о том, что вы спрашиваете здесь; Вы имеете в виду словарь ? или переменная ? потому что это две совершенно разные вещи .

Словарь - это объект в управляемой куче.

Переменная (ссылка на объект в управляемой куче) - может означать «локальный», «параметр» или «поле». Поля имеют значение , где бы они ни находились , и зависят от того, что имеет поле (ссылочный тип, против неупакованного типа значения (который сам может быть или не может быть полем на чем-либо), против упакованного значения - тип). Может быть куча или стек. Параметры и локальные значения обычно в стеке, за исключением случаев, когда они записываются в контекст состояния (асин c методы, анонимные методы / лямбды, блоки итераторов, локальные функции), в в каком случае они фактически рассматриваются как поля; и «поля того, что» зависит от точного контекста (например, локальные функции являются структурами). Также обратите внимание, что стек - это деталь реализации!

Но вы , вероятно, имеете в виду «сам словарь», в этом случае: управляемая куча.

1 голос
/ 30 января 2020

Вы всегда можете проверить Справочный источник, чтобы увидеть большинство реализаций. NET:

https://referencesource.microsoft.com/#mscorlib / system / collection / generic / dictionary.cs, d3599058f8d79be0

Все записи в Словаре, например, являются структурами, поэтому они будут обрабатываться как:

private struct Entry {
        public int hashCode;    // Lower 31 bits of hash code, -1 if unused
        public int next;        // Index of next entry, -1 if last
        public TKey key;           // Key of entry
        public TValue value;         // Value of entry
    }
...