首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

[你必須知道的.NET] 第八回:品味類型——值類型與引用類型(上)記憶體機制深度解析

     編輯:關於.NET

在 .NET 開發的進階之路上,理解「值類型」與「引用類型」的本質差異,是打通記憶體管理、效能調優與避免常見 Bug 的關鍵基石。本文將從記憶體分配機制出發,深入剖析兩者的運作模式、嵌套場景以及陣列實例化的差異,並輔以 IL 級別的視角,幫助你建立堅實的類型系統心智模型。

1. 核心概念速覽

根據 CLR 的通用類型系統(CTS),所有類型分為兩大陣營:

  • 值類型:直接包含資料,實例通常分配在執行緒堆疊上,或內聯於參考類型的物件內部。包含基本型別(int、bool、double 等)、結構(struct)與列舉(enum)。
  • 引用類型:變數儲存的是指向託管堆上物件的參考(記憶體位址)。包含類別(class)、介面、委派、陣列、string 及 object。

CTS 類型分層圖

2. 記憶體分配機制深度剖析

2.1 基本分配邏輯

當我們執行 new MyStruct() 與 new MyClass() 時,發生了什麼?

  • 值類型:在堆疊上直接分配記憶體並存放實例資料。兩個變數賦值時,會發生資料複製,各自擁有獨立記憶體空間,互不干擾。
  • 引用類型:在堆疊上分配一個參考變數,指向託管堆上新建立的物件。賦值時複製的是參考位址,多個變數可能指向同一個堆上物件,修改其中一個會影響其他。

值類型與引用類型記憶體佈局對比

2.2 特殊場景:成員變數與大型物件

  • 值類型作為類別成員:隨著宿主物件一同分配在託管堆上(內聯)。
  • 大型物件堆(LOH):引用類型實例 ≥ 85,000 Bytes 時,直接分配在 LOH,由 GC 以不同策略管理。

3. 嵌套結構的記憶體圖譜

3.1 引用類型內嵌值類型

public class NestedValueinRef {
    private int aInt; // 隨物件在託管堆上
    public NestedValueinRef() {
        char achar = 'a'; // 區域變數在堆疊上
    }
}

引用類型內嵌值類型記憶體圖

3.2 值類型內嵌引用類型

public struct NestedRefinValue {
    public MyClass myClass; // 堆疊存參考,堆存實際物件
    public NestedRefinValue() {
        myClass.X = 1;
        myClass.Y = 2;
    }
}

值類型內嵌引用類型記憶體圖

4. 陣列實例化的記憶體差異

執行 AType[] myType = new AType[10]; 時:

元素類型記憶體分配行為
值類型 (如 Int32) 陣列本身為引用類型,在堆上分配連續 40 Bytes (4×10),所有元素初始化為 0。
引用類型 (自訂類別) 僅在堆上分配陣列參考結構(10 個 null 參考),元素物件需另行 new 建立。

5. 小結與預告

掌握記憶體分配差異,即掌握了參數傳遞(ByVal/ByRef)、装箱拆箱、效能優化的根本邏輯。下一回將進入「通用規則與區別、實例分析、應用場合、類型比較」等實戰層面,敬請期待。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved