Где выделяется память для статических, постоянных и только для чтения полей? - PullRequest
0 голосов
/ 09 января 2019

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

static int a;
const int b=1235;
readonly int c;

в ILDASM поля описываются следующим образом

для статического: .field private static int32 a

для константы: .field частный статический литерал int32 b = int32 (0x000004D3)

только для чтения: .field private initonly int32 c

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Как вы знаете, const является статическим, что означает, что он хранится в куче. Readonly просто как член. Как и любой другой член, значение readonly также сохраняется в куче. Для получения дополнительной информации о const и readonly см. Ссылку ниже. https://blogs.msdn.microsoft.com/csharpfaq/2004/12/03/what-is-the-difference-between-const-and-static-readonly/

0 голосов
/ 16 января 2019

CLR делит память на три отдельные области: стек, куча и высокочастотная куча. Статические объекты должны выживать в коллекции GC и храниться в высокочастотной куче. Статические и константные объекты хранятся в куче загрузчика, поскольку они существуют в памяти в течение всего времени жизни приложения; их не нужно собирать мусором.

0 голосов
/ 09 января 2019

Каждая статическая переменная хранится в куче, независимо от того, объявлена ​​ли она в ссылочном типе или типе значения. Всего есть только один слот, независимо от того, сколько экземпляров создано. (Однако для того, чтобы этот слот существовал, не нужно создавать никаких экземпляров.) Детали того, в какой именно куче находятся переменные, сложны. больше информации вы можете найти ЗДЕСЬ

...