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

.NET 記憶體管理深度解析:值類型與參考類型的堆疊/堆積配置、指派語意與複雜物件圖佈局

     編輯:關於.NET

深入理解值類型與參考類型的記憶體行為是精通 .NET 的基石。本文從區域變數宣告、指派操作、複雜巢狀結構三個維度,配合記憶體圖示,徹底釐清「值類型在堆疊、參考類型在堆積」的迷思與真相。

區域變數宣告時的記憶體配置

private static void Main()
{
    int i;          // 值類型
    MyClass mc;     // 參考類型
    i = 5;
    mc = new MyClass();
}

值類型 (int)

  • 堆疊配置 4 位元組,直接儲存數值 5。
  • 讀寫單一指令完成,無間接存取。

堆疊框圖:i → [5]

參考類型 (MyClass)

  • 堆疊配置 指標大小 (32 位元 4 bytes / 64 位元 8 bytes),初始為 null (零位址)。
  • new MyClass() 在**堆積**配置物件實例,將起始位址存入堆疊變數。
  • 存取需兩步:讀取指標 → 定位堆積物件 → 讀寫欄位。

堆疊 mc → 指標 → 堆積 MyClass 實例

指派操作的語意差異

值類型指派:內容複製

int i = 5;
int j = i;  // 複製 5 到 j
j = 10;     // i 仍為 5,互不影響

i=[5], j=[5] 獨立儲存

結構體同理,struct 指派為**逐欄位複製** (Shallow Copy)。

參考類型指派:參考複製

MyClass x = new MyClass();
MyClass y = x;  // 複製指標,x 與 y 指向同一堆積物件

x → 指標 → 堆積實例 ← y

任一變數修改物件狀態,另一變數讀取皆見新值。這是**別名**關係,非複製物件。

複雜巢狀結構記憶體佈局

結構體包含參考類型欄位

struct MyStruct
{
    public int i;           // 值類型:內嵌儲存
    public Exception ex;    // 參考類型:儲存指標,實例在堆積
}

MyStruct 實例 (值類型) 內含 int 值與 Exception 指標,指向堆積 Exception 物件

結構體本身是值類型,但其參考類型欄位仍指向堆積。

類別包含結構體與參考類型欄位

class MyClass
{
    public MyStruct ms;     // 值類型:內嵌於 MyClass 物件內部 (堆積)
    public Random r;        // 參考類型:指標指向另一堆積物件
}

MyClass 堆積實例:內嵌 MyStruct (含 int 與 Exception 指標)、Random 指標 → 堆積 Random 物件

**鐵律**:參考類型實例永遠在堆積;值類型實例「跟著走」 — 作為區域變數在堆疊,作為類別欄位內嵌在堆積,作為結構體欄位內嵌在結構體內。

總結與正確說法

錯誤說法:「值類型在堆疊,參考類型在堆積」。

正確說法:「值類型變數的值儲存在變數本身;參考類型變數的值儲存在堆積,變數本身儲存指向堆積值的參考。」

  • 指派:值類型複製內容 (獨立);參考類型複製參考 (共享)。
  • 複雜物件圖:遞歸應用上述原則,無例外。

掌握這些核心機制,能避免常見 Bug (如結構體修改失效、預期獨立卻共享狀態)、優化效能 (減少裝箱/解箱、理解傳值/傳參成本)、正確實作 IDisposable 與最終化邏輯。

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