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

C# 結構 vs 類別:核心差異、記憶體模型與選擇指南

     編輯:關於C#

一眼看懂核心差異

特性結構類別
型別分類值型別參考型別
記憶體配置堆疊 (或內嵌在物件內)受控堆積
指派語意複製整個實例 (深層複製)複製參考 (淺層複製)
繼承不可繼承類別/結構,隱含 sealed;可實作介面單一繼承,可標記 sealed 防繼承
建構函式無預設無參建構子;可自訂有參建構子有預設無參建構子;可多載
解構函式不支援支援 (Finalizer)
null 值不可為 null (除非用 Nullable<T>)可為 null
預設值所有欄位歸零null

記憶體配置圖解


// 程式碼
struct Point { public int X, Y; }
class  Node  { public int X, Y; }

var s = new Point { X = 1, Y = 2 }; // 堆疊配置
var c = new Node  { X = 1, Y = 2 }; // 堆積配置,s 直接持有值,c 持有參考

var s2 = s; // 複製值,s2 獨立於 s
var c2 = c; // 複製參考,c2 與 c 指向同一物件
s2.X = 99;  // 不影響 s
c2.X = 99;  // 影響 c (c.X 也變 99)

效能影響分析

  • 堆疊配置:極快 (指標遞增),無 GC 壓力,適合小型、短命、高頻物件 (如座標、矩陣、DateTime)。
  • 堆積配置:較慢 (GC 管理)、需壓縮/代碼回收,適合大型、長命、複雜行為物件 (如視窗、資料庫連線、業務實體)。
  • 盒裝/拆箱:結構當作 `object`/`interface` 使用時會盒裝至堆積,頻繁轉型會嚴重影響效能。

何時選擇結構?

✅ 符合所有條件 才建議用 `struct`:

  1. 邏輯上代表單一值 (如 `int`、`DateTime`、`Guid`)。
  2. 實例大小 < 16 bytes (參考來源:Framework Design Guidelines)。
  3. 不可變 (所有欄位 `readonly` / 唯讀屬性)。
  4. 不頻繁盒裝 (不當作 `object`/`IEnumerable` 等介面使用)。

何時選擇類別?

✅ 其餘情況 皆建議用 `class`:

  • 需要繼承/多型。
  • 大型資料結構 (超過 16 bytes)。
  • 可變狀態、複雜行為、身分識別重要 (Entity、Service、Controller)。
  • 需為 `null` 表示「不存在」。

C# 7.2+ 新特性:readonly struct / ref struct


// 唯讀結構:編譯器強制所有欄位 readonly,避免防禦性複製
public readonly struct Vector3
{
    public double X { get; }
    public double Y { get; }
    public double Z { get; }
    public Vector3(double x, double y, double z) => (X, Y, Z) = (x, y, z);
}

// ref struct:只能存在於堆疊,不能盒裝、不能作為欄位、不能用於 async/iterator
// 適用於高效能 Span-like 型別
public ref struct SpanWrapper
{
    private Span<byte> _span;
    public SpanWrapper(Span<byte> span) => _span = span;
}

常見錯誤與陷阱

錯誤寫法問題修正
結構欄位未初始化就使用編譯錯誤 CS0165建構子初始化所有欄位,或使用 `default`
結構實作介面並頻繁當作介面傳遞盒裝產生 GC 壓力改用泛型約束 `where T : IInterface` 避免盒裝
以類別思維設計結構 (可變、大型)複製語意導致 Bug、效能差改用 class 或 immutable struct

總結

結構與類別的選擇本質上是值語意 vs 參考語意、堆疊 vs 堆積、複製 vs 共享的權衡。遵循「預設用類別,符合值型別準則才用結構」原則,並善用 `readonly struct`、`record struct` (C# 10) 等現代特性,能寫出既安全又高效的程式碼。

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