7

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

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

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

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

public class Employee
{
    public int EmpNo { get; set; }
    public string EmpName { get; set; }
    public BankAccDetails AccDetails { get; set; }
}

public class BankAccDetails
{
    //Other properties here
}
4

2 回答 2

5

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

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

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

值类型的真相 - Eric Lippert

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

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

于 2012-08-09T03:59:39.487 回答
0

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

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

于 2012-08-09T03:50:36.003 回答