在.NET中,引用类型内的值类型的内存分配

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
}

可能是 https://dev59.com/g0jSa4cB1Zd3GeqPFW8_ 的重复提问。 - Carth
2个回答

7

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

但是,您应该查看以下关于C#中的内存管理的文章。

有关值类型的真相-Eric Lippert

在桌面CLR上的微软C#实现中,当值是不是lambda或匿名方法的闭合局部变量的本地变量或临时变量,并且方法体不是迭代器块,jitter选择不将值注册时,值类型存储在堆栈上。

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


非常感谢提供这些链接。为什么我之前找不到这些文章呢?也许是我在谷歌搜索时没有使用正确的关键词!! :) - samar

0

它们被初始化为它们的默认值,即int和float为0,bool为false,其他数据类型为null。结构体使用默认构造函数进行初始化。另请参见默认关键字以初始化通用类型,而不知道它们是否为简单数据类型。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接