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

时间:2012-08-09 03:46:58

标签: c# .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
}

2 个答案:

答案 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以初始化泛型类型,而无需知道它们是否是简单数据类型。

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

相关问题