我认为这是一个非常微不足道的问题,但我无法在网上得到明确答案。
我有一个包含值类型和引用类型的类。考虑到类中的引用类型将在执行期间的某个时间实例化,如何为这样的类的每个成员分配内存?如何为每个成员存储和访问指针?还创建了哪种类型的内存结构,即堆栈或堆?
我非常了解如果在我的代码中只使用了值类型的变量,那么它的值和所有其他细节(如类型等)都存储在堆栈中。类似地,如果实例化引用类型,则在堆中创建实际对象,并且将指向该存储器位置的指针存储在堆栈中。但是类(参考类型)中存在的值类型呢?它们存储在哪里以及如何访问它们?
我在下面给出了这样一个类的例子。参考这门课的答案非常有用。
public class Employee
{
public int EmpNo { get; set; }
public string EmpName { get; set; }
public BankAccDetails AccDetails { get; set; }
}
public class BankAccDetails
{
//Other properties here
}
答案 0 :(得分:4)
但是类(引用类型)中存在的值类型呢? 它们存储在哪里以及如何访问它们?
值类型存储在声明它们的位置。在你的情况下,他们将在堆上。
但是你应该在C#中看到以下关于内存管理的文章。
The Truth about value types - Eric Lippert
在桌面CLR的Microsoft实现C#中,值类型 当值是局部变量或时,存储在堆栈中 临时的,不是lambda或的一个封闭的局部变量 匿名方法,方法体不是迭代器块,而且 抖动选择不注册该值。
The Stack Is An Implementation Detail, Part One - Eric Lippert
Memory in .NET - what goes where - Jon Skeet
答案 1 :(得分:0)
它们被初始化为默认值,对于int和float为0,对于bool为false,对于每个其他数据类型为null。使用默认构造函数初始化结构。另请参阅the default keyword以初始化泛型类型,而无需知道它们是否是简单数据类型。
对象存储在堆上,每个字段都有一些空格,值类型的值或其他类型的指针。它们是对齐的,这意味着对象中可能存在空隙。