2012-08-09 95 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以初始化泛型,而不知道它們是否爲簡單數據類型。

對象存儲在堆上,每個字段都有一些空格,可以是值類型的值,也可以是其他類型的指針。它們是對齊的,這意味着對象中可能存在空隙。