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

问题描述 投票:7回答:2

我认为这是一个非常琐碎的问题,但是我无法在网络上得到确切的答案。

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

我非常了解,如果在我的代码中仅使用值类型的变量,则其值和所有其他详细信息(例如其类型等)都将存储在堆栈中。类似地,如果实例化引用类型,则会在堆中创建实际对象,并将指向该内存位置的指针存储在堆栈中。但是类中存在的值类型(引用类型)呢?它们存储在哪里以及如何访问?

我在下面给出了此类的示例。有关此类的答案将非常有帮助。

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# .net
2个回答
5
投票

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

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

但是您应该参阅以下有关C#中的内存管理的文章。

The Truth about value types - Eric Lippert

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

The Stack Is An Implementation Detail, Part One - Eric LippertMemory in .NET - what goes where - Jon Skeet


0
投票

它们被初始化为其默认值,对于int和float,它们是0;对于bool,它是false;对于其他所有数据类型,它们都是null。使用默认构造函数初始化结构。另请参见the default keyword以初始化通用类型,而不知道它们是否为简单数据类型。

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

© www.soinside.com 2019 - 2024. All rights reserved.