Где будут храниться переменные, созданные ссылочным пространством? Как они будут привязаны к своему эталонному пространству? - PullRequest
1 голос
/ 07 января 2020

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

Теперь у меня есть случай, когда в ссылочном пространстве создается локальный объект. Итак, где будет сохранен этот объект и как на него будет ссылаться?

Я пытаюсь выяснить, какие переменные хранятся в памяти стека и в куче.

Сотрудник .cs

        class Employee
        {
            int EmpId;
            public int GetEmpId()
            {
                 return this.EmpId ;
            }

            public void SetEmpId(int EmpId)
            {
                this.EmpId = EmpId;
            }

            public Job j = new Job();
        }

Job.cs

    class Job
    {
        int JobId;

        public int GetJobId()
        {
             return this.JobId ;
        }

        public void SetJobId(int JobId)
        {
            this.JobId = JobId;
        }

    }

Program.cs

    class Program
    {
        static int a =1;
        static void Main(string[] args)
        {
            Employee E1 = new Employee();
            Employee E2 = new Employee();

            E1.SetEmpId(2595);
            E1.j.SetJobId(25);

            Console.WriteLine(E1.GetEmpId());
            Console.WriteLine(E1.j.GetJobId());

        }

    }

Я использую код Visual Studio.

Может кто-нибудь помочь мне найти, что входит в стековую память, а что в кучную память?

1 Ответ

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

Пространство стека используется для передачи аргументов методу и для локальных переменных определено в методе. Локальные переменные ссылочного типа будут храниться в куче, а указатель на эти объекты будет храниться в стеке. Но локальные переменные типа значения будут храниться в стеке.

Кстати, пространство стека принадлежит потокам. Размер стека по умолчанию составляет 1 МБ. Каждый поток получает стек, в то время как для приложения обычно есть только одна куча.

И объекты хранятся в куче вместе со всеми их полями и свойствами.

Теперь давайте go line по линии.

static int a = 1;

Поля Stati c будут храниться в куче вместе с объектом Type. Потому что поля stati c на самом деле относятся к объекту Type, который будет автоматически создан CLR при первом доступе к экземпляру этого Type или непосредственно к Type. Этот Type объект содержит всю информацию, относящуюся к типу.

Тогда:

  Employee E1 = new Employee();
  Employee E2 = new Employee();

У вас есть два Employee объекта в куче. И адреса этих объектов в стеке (E1 и E2). Но если Employee был структурой, то E1 и E2 будут храниться в стеке вместе со всей информацией. Если в этой структуре есть какое-то поле ссылочного типа, то данные этого поля будут храниться в куче, а адрес этого поля будет храниться в стеке внутри Employee.

...