如何针对以下场景进行内存分配?我设法弄糊涂了

Dip*_*iya 1 c# clr stack memory-management heap-memory

我在下面提到了名为"Employee"的属性类.

public class Employee
{
    public int EmpID { get; set; }
    public int DeptId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我们都知道"int"数据类型将存储在堆栈中,而Object类型将存储在堆中,如下面的snap所示.

在此输入图像描述

这里我的问题是,当我要创建一个Employee类的对象时

Employee objEmployee = new Employee();
Run Code Online (Sandbox Code Playgroud)

如何进行内存分配?

任何文献或相关链接将不胜感激.

Eri*_*ert 13

我们都知道"int"数据类型将存储在堆栈中,而Object类型将存储在堆中,如下面的snap所示.

由于这完全假的,我们并不是都知道.

想一想:

int[] M() { return new int[] { 1 }; }
Run Code Online (Sandbox Code Playgroud)

堆叠中的1是?如果是这样,那么在M返回后如何从M的呼叫者访问它?

显然它不可能.即使它是一个int,1也在堆上.

你的问题是你在考虑价值而不是变量.变量是存储,无论是否存在整数或引用.存储必须在某个地方.存储的位置取决于生命周期要求. 可以在短期存储池(堆栈或寄存器)之外分配短期存储.长期存储分配在长期存储池(堆)之外.它与存储的值是结构还是引用没有任何关系.

在您的示例中,属性的后备存储可以任意长,因此必须从堆中分配.

你需要简单地停止相信价值类型的价值在堆栈上的神话.值存储存储中,存储位于满足其生命周期要求所需的位置.