.net中引用类型内的值类型的内存分配

我认为这是一个非常微不足道的问题,但我无法在网上得到明确答案。

我有一个包含值类型和引用类型的类。 考虑到类中的引用类型将在执行期间的某个时间实例化,如何为这样的类的每个成员分配内存? 如何为每个成员存储和访问指针? 还有哪种类型的内存结构,即堆栈或堆?

我知道这很多,如果我的代码中只使用了一个值类型的变量,那么它的值和所有其他细节(如类型等)都存储在堆栈中。 类似地,如果实例化引用类型,则在堆中创建实际对象,并且将指向该存储器位置的指针存储在堆栈中。 但是类(引用类型)中存在的值类型呢? 它们存储在哪里以及如何访问它们?

我在下面给出了这样一个类的例子。 参考这个课程的答案将非常有帮助。

public class Employee { public int EmpNo { get; set; } public string EmpName { get; set; } public BankAccDetails AccDetails { get; set; } } public class BankAccDetails { //Other properties here } 

但是类(引用类型)中存在的值类型呢? 它们存储在哪里以及如何访问它们?

值类型存储在声明它们的位置 。 在你的情况下,他们将在堆上。

但是你应该在C#中看到有关内存管理的以下文章。

关于价值类型的真相 – Eric Lippert

在桌面CLR上的Microsoft C#实现中,当值是局部变量或临时不是lambda或匿名方法的封闭局部变量时,值类型存储在堆栈中,并且方法体不是迭代器块,抖动选择不注册该值。

堆栈是一个实现细节,第一部分 – Eric Lippert
.NET中的内存 – 它在哪里 – Jon Skeet

它们被初始化为默认值,对于int和float为0,对于bool为false,对于每个其他数据类型为null。 使用默认构造函数初始化结构。 另请参阅default关键字以初始化generics类型,而无需知道它们是否是简单数据类型。

对象存储在堆上,每个字段都有一些空间,值类型的值或其他类型的指针。 它们是对齐的,这意味着对象中可能存在空隙。