Sushant Prusty Ответов: 2

Где типы значений, объявленные внутри ссылочных типов, хранятся в памяти в C#?


1 & gt; типы значений хранятся в стеке .
2 & gt; объекты хранятся в куче.
3. Таким образом, типы значений внутри ссылочных типов также хранятся в куче.
4. но мы не можем объявлять типы значений независимо, то есть мы должны обернуть их в класс и создать объекты для доступа к ним.
5.таким образом, 1-е утверждение противоречит.

Пожалуйста, помогите мне, так как я получаю разные вещи в разных статьях, поэтому не могу сделать вывод.

Что я уже пробовал:

Я просмотрел разные статьи, но не был удовлетворен, так как получаю разные и противоречивые ответы.

2 Ответов

Рейтинг:
1

Richard Deeming

"Стек" и "куча" - это детали реализации, и они не так важны, как наблюдаемые характеристики типов значений и ссылок:
Стек-Это Деталь Реализации, Часть Первая-Сказочные Приключения В Кодировании[^]
Стек-Это Деталь Реализации, Часть Вторая-Сказочные Приключения В Кодировании[^]

Но эти термины все же могут быть полезны при размышлении о том, как ведут себя типы.

Я думаю, что было бы правильнее сказать, что данные для типа значения хранятся встроенный, в то время как данные для ссылочного типа хранятся в другом месте (на куче), с адрес о том, что эти данные хранятся встроенно.

Итак, задан ссылочный тип, содержащий два поля:

class Foo
{
    int x = 42;
    string s = "Bar";
}

и экземпляр такого типа:
Foo f = new Foo();

f хранит адрес данных для этого экземпляра-например: 0x1234567 Эти данные могут выглядеть примерно так:
// i:
0x1234567:   0
0x1234568:   0
0x1234569:   0
0x1234570:  42

// Address of s:
0x1234571:  11
0x1234572: 173
0x1234573: 240
0x1234574:  13

Данные для i хранится: 42. Но данные для s сохраненный где-то еще, по адресу 0x0BADF00D:
0x0BADF009:   0 // Length
0x0BADF00A:   0 
0x0BADF00B:   0 
0x0BADF00C:   3 
0x0BADF00D:  66 // "B"
0x0BADF00E:  97 // "a"
0x0BADF00F: 114 // "r"

Конечно, это игнорирует понятие "коробочных" типов значений[^], которые хранятся так же, как и ссылочные типы.

Еще немного легкого чтения: :)
Правда О Типах Значений-Сказочные Приключения В Кодировании[^]
Развенчание еще одного мифа о типах ценностей-сказочные приключения в кодировании[^]
Шесть важных .Сетевые концепции: стек, куча, типы значений, ссылочные типы, бокс и распаковка[^]


Рейтинг:
0

F-ES Sitecore

Цитата:
типы значений хранятся в стеке .


static int x; // is this on the stack? :)


Объекты хранятся в куче, и все свойства этого объекта (даже типы значений) являются частью этого объекта, поэтому они также находятся в куче.


Sushant Prusty

- Спасибо, сэр.
Здесь x-статическая переменная, и когда она будет выделена, она будет сохранена как часть Methodtable в Appdomain. Таким образом, когда класс загружается в первый раз в приложении, в appdomain будет выделена отдельная память для переменных уровня класса и методов внутри него.
Если статическая переменная имеет примитивный тип, она будет храниться как часть Methodtable. Если это ссылочный тип, то он будет храниться внутри кучи, а ссылка будет храниться в Methodtable.
Так что же хранится внутри стека или регистра?