【问题标题】:memory allocation for value type inside reference type in .net.net中引用类型内的值类型的内存分配
【发布时间】:2012-08-06 06:29:33
【问题描述】:

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

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

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

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

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


【解决方案1】:

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

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

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

The Truth about value types - Eric Lippert

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

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

【讨论】:

  • 非常感谢您提供的链接。我怎么找不到这些文章?也许我没有在谷歌搜索中输入正确的关键字! :)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2012-03-08
    • 2013-09-29
    • 1970-01-01
    • 2018-05-21
    • 2016-04-03
    相关资源
    最近更新 更多