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

[你必須知道的.NET] 第四回:class 與 struct 深度比較(一):本質差異、語法相似度、12 大不同點、選擇指南

     編輯:關於C語言

一、引言

class 與 struct 語法幾乎相同,但待遇天差地別。本質上:class = 參考型別(堆積),struct = 值型別(堆疊)。此差異衍生出所有行為不同。本文為系列第四回第一部分。

二、基本概念

class(類別)

  • 面向對象基本單位,封裝欄位、屬性、方法、事件、建構函式等
  • 所有類別隱含繼承 System.Object
  • 參考型別:new 回傳參考(位址),物件資料在受控堆積

struct(結構)

  • 將相關變數組織為單一實體
  • 所有結構隱含繼承 System.ValueType(繼承自 Object)
  • 值型別:變數直接包含資料,配置在執行緒堆疊或內嵌於其他物件中

三、12 大不同點完整對照表

#特性classstruct
1型別分類參考型別值型別
2基底類別System.ObjectSystem.ValueType
3多型支援完整支援不支援(密封,無虛擬方法)
4繼承能力可繼承類別/介面,可為基類不可繼承類別/結構,不可為基類,可實作介面
5建構函式可定義無參/有參僅能定義有參建構函式,無參由編譯器產生(歸零初始化)
6解構函式可定義不可定義
7實例化需 new可不需 new(宣告即初始化歸零)
8抽象/虛擬可 abstract/virtual不可 abstract/virtual
9修飾符限制可 protected/virtual/sealed/override不可上述修飾符,可覆寫 Object 三虛擬方法 (Equals/ToString/GetHashCode)
10複製語意淺/深複製需手動實作指派即值複製,簡單高效
11記憶體回收GC 追蹤回收離開作用域立即釋放(堆疊展開)
12參數傳遞傳參考(傳址)傳值(複製副本)

四、本質理解:記憶體配置圖解


// class: 參考型別
MyClass a = new MyClass(); // a 在堆疊,指向堆積物件
MyClass b = a;             // b 複製參考,指向同一物件

// struct: 值型別
MyStruct x = new MyStruct(); // x 在堆疊,直接包含資料
MyStruct y = x;              // y 複製整個資料,獨立副本

記憶體配置示意圖

五、為什麼 class 後來居上?

面向對象編程核心是行為與多型。class 提供完整多型、繼承、封裝,符合 OOP 主流。struct 定位為資料容器(零件盒),class 為有行為的機器。

六、struct 仍有一席之地的理由(效能導向)

  1. 主要儲存資料:DPO、DTO、數值型別、幾何結構
  2. 小型資料:< 16 位元組,複製成本可接受
  3. 陣列效能:Struct[] 連續記憶體、CPU 快取友善、無 GC 壓力
  4. 非受控互通:記憶體配置與 C/C++ 結構相容

七、選擇決策樹


需要多型/繼承/複雜行為? → 是 → class
否
    ↓
主要是資料容器、不可變、小於 16 bytes? → 是 → struct
否
    ↓
大量陣列分配、效能關鍵路徑? → 是 → struct (測試驗證)
否
    ↓
預設 → class

八、總結

class 與 struct 最大差異在於記憶體配置位置(堆積 vs 堆疊),衍生出複製語意、繼承、多型、GC、參數傳遞等所有不同。理解記憶體模型,才能做正確選擇。下一篇將以經典範例與 .NET Framework 實作深度驗證。

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