簡體   English   中英

.net 中引用類型內部值類型的內存分配

[英]memory allocation for value type inside reference type in .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
}

但是存在於類中的值類型(引用類型)呢? 它們存儲在哪里以及如何訪問?

值類型存儲在聲明它們的地方 在您的情況下,它們將在堆上。

但是您應該看到以下有關 C# 內存管理的文章。

關於值類型的真相 - Eric Lippert

在桌面 CLR 上的 C# 的 Microsoft 實現中,當值是局部變量或臨時值而不是 lambda 或匿名方法的封閉局部變量時,值類型存儲在堆棧中,並且方法體不是迭代器塊,並且抖動選擇不注冊該值。

堆棧是一個實現細節,第一部分 - Eric Lippert
.NET 中的內存 - 何去何從 - Jon Skeet

它們被初始化為默認值,對於 int 和 float 為 0,對於 bool 為 false,對於其他所有數據類型為 null。 使用默認構造函數初始化結構。 另請參閱用於初始化泛型類型的 default 關鍵字,而無需知道它們是否是簡單數據類型。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM