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

C# 結構型別:值型別封裝、記憶體佈局、效能優勢與設計準則

     編輯:關於C語言

為什麼需要結構?

通訊錄記錄含姓名、電話、地址。用簡單型別需三個變數管理,不直觀。結構將相關變數組織為單一實體。

基本宣告與使用

struct PhoneBook
{
    public string Name;
    public string Phone;
    public string Address;
}

PhoneBook p1;
p1.Name = "Mike";
p1.Phone = "0912-345678";
p1.Address = "Taipei";
  • struct 關鍵字宣告
  • 成員存取:變數.成員
  • public 表公開存取權限

結構進階:巢狀結構與混合成員

struct Address
{
    public string City;
    public string Street;
    public uint No;
}

struct PhoneBook
{
    public string Name;
    public uint Age;
    public string Phone;
    public Address Address;  // 結構作為成員型別
}

// 使用
PhoneBook pb;
pb.Address.City = "Taipei";
pb.Address.Street = "Renai Rd";
pb.Address.No = 100;

結構 vs 類別:核心差異

特性struct (值型別)class (參考型別)
記憶體配置Stack(區域變數)/ Inline(陣列/欄位)Heap
指派行為複製整個實體複製參考
預設值所有欄位為 0/null/falsenull
繼承不可繼承類別,可實作介面單一繼承
建構函式不可定義無參建構函式(C# 10 前)可定義任意建構函式
解構函式不可定義可定義
null 值不可為 null(除非 Nullable<T>)可為 null

效能優勢場景

  • 小型、不可變、高頻建立:Point、Vector、DateTime、Guid
  • 大量陣列:Point[] 連續記憶體,無參考間接層,Cache 友善
  • 避免 GC 壓力:值型別不產生 Heap 物件,減少 Gen 0 收集

設計準則(Microsoft 官方建議)

  1. 單一責任:邏輯單一、資料為主
  2. 不可變:欄位 readonly、屬性唯讀
  3. 大小 ≤ 16 位元組:超過改用類別(複製成本高)
  4. 不頻繁裝箱:避免頻繁當作 object/介面使用
  5. 實作 IEquatable<T>:避免裝箱比較

常見誤區

  • 結構不能有方法?→ 可定義方法、屬性、索引子、事件、運算子多載
  • 結構不能實作介面?→ 可實作介面(但裝箱發生)
  • struct 節省記憶體?→ 區域變數是,但頻繁當參數傳遞/裝箱反而較重

C# 7.0+ 進階:readonly struct、ref struct

readonly struct Point3D  // 編譯器強制不可變
{
    public readonly double X, Y, Z;
    public Point3D(double x, double y, double z) => (X, Y, Z) = (x, y, z);
}

ref struct SpanWrapper  // 僅能棲息於 Stack,不可裝箱、不可作為類別欄位
{
    public Span<byte> Data;
}

總結

結構是值型別封裝利器,適用於小型、不可變、高頻資料。善用 readonly struct、ref struct 發揮極致效能,避免濫用導致複製成本與裝箱開銷。

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