2012-08-09 71 views
4

我认为这是一个非常微不足道的问题,但我无法得到一个明确的答案在网上。内存分配的值类型内参考类型在.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 
} 
+3

你需要看到的[真相值类型 - 从埃里克利珀(http://blogs.msdn.com/b/ericlippert/archive/2010/09/30 /the-truth-about-value-types.aspx) – Habib 2012-08-09 03:50:17

+0

http://stackoverflow.com/questions/1130468/memory-allocation-of-value-types-and-reference-types-in-net-framework的可能重复? – Carth 2012-08-09 03:52:45

回答

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

+0

非常感谢您的链接。为什么我无法找到这些文章?也许我没有在Google搜索中输入正确的关键字! :) – samar 2012-08-18 08:56:23

0

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

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