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

C# 值型別與參考型別深度解析:記憶體模型、傳遞語意與效能影響

     編輯:ASP.NET 基礎

核心差異總覽

維度值型別 (Value Type)參考型別 (Reference Type)
繼承鏈struct → ValueType → Objectclass → Object
記憶體配置Stack (區域變數) / Inline (陣列/欄位)Managed Heap (參考指向 Heap 物件)
變數內容直接包含資料 (bits)包含參考位址 (指標)
指派/傳遞語意複製資料副本複製參考 (指向同一物件)
預設值全 0 (數值 0、false、null 字元...)null
可為 null不可 (除非 Nullable<T> / T?)可
GC 管理否 (隨作用域自動釋放)是 (GC 追蹤、標記-壓縮)
繼承能力密封,不可繼承類別,可實作介面可繼承 (非 sealed)
多型支援無 (介面除外)有 (virtual/override)
裝箱/拆箱有 (值 ↔ object/介面)只有裝箱 (參考型別本身即物件)
典型代表int, double, bool, struct, enum, DateTimeclass, string, delegate, array, interface

記憶體配置圖解


// 程式碼
int a = 10;           // 值型別區域變數
int b = a;            // 複製值
b = 20;               // a 不受影響

class Ref { public int Val; }
Ref r1 = new Ref { Val = 10 }; // r1 在 Stack,物件在 Heap
Ref r2 = r1;                    // 複製參考
r2.Val = 20;                    // r1.Val 也變 20

Stack:


a: [10]          r1: [Heap Address 0x1000]
b: [20]          r2: [Heap Address 0x1000]  (同一位址)

Heap:


0x1000: Ref { Val: 20 }  (被 r1、r2 共同指向)

方法參數傳遞機制

參數修飾詞值型別行為參考型別行為
(預設) ByVal複製結構體所有欄位 (大結構體有開銷)複製參考 (指向同一物件)
ref傳遞變數位址,可修改原變數值傳遞參考位址,可替換原參考指向新物件
out同 ref,但呼叫端無需初始化,方法必須指派同 ref
in (C# 7.2+)唯讀傳遞位址,避免複製大結構體唯讀傳遞參考 (編譯器保護)

void ByVal(int x) { x = 20; }
void ByRef(ref int x) { x = 20; }
void ByOut(out int x) { x = 20; }
void ByIn(in int x) { /* x = 20; 編譯錯誤 */ }

int v = 10;
ByVal(v);  // v = 10
ByRef(ref v); // v = 20
ByOut(out v); // v = 20
ByIn(in v);   // v = 20 (不變)

裝箱與拆箱


// 裝箱:值型別 → object/介面 (Heap 配置、複製資料)
int i = 10;
object o = i;           // 隱式裝箱
Console.WriteLine(o);   // 10

// 拆箱:object/介面 → 值型別 (型別檢查、複製資料回 Stack)
int j = (int)o;         // 顯式拆箱
// int k = (long)o;    // InvalidCastException:必須精確型別

// 介面裝箱
IComparable cmp = 10;   // int 實作 IComparable → 裝箱

效能影響