資訊技術

C# 不可變資料設計

Records 與狀態建模

作者: 蔡煥麟
語言: 繁體中文
定價: NT$290 NT$145 (雙十國慶/新書上架)
出版日期: 2026/11/01
閱讀方式: 線上閱讀+EPUB 下載(本站購買)

本書介紹如何在 C# 中運用不可變資料設計(immutable data design),降低可變狀態在程式中流動時帶來的除錯與維護成本。你會看到如何使用 record、init、required、with 運算式、不可變集合與模式比對,把「修改物件」改寫成更容易追蹤、測試與維護的資料轉換。

Note: 本書目前為 beta 版,僅於本站上架銷售。正式版預計於 2026 年 11 月 1 日完成正式出版,屆時也會上架至 Google Play Books、讀墨 Readmoo、和樂天 Kobo。

作者序

以當前 LLM(Large Language Model)的能力,開發人員可能只要對 AI agent 說:「幫我把這個專案的某些類別重構成 immutable types。」AI 就能完成重構,連相關的測試也一併寫好。

然而,開發者如何能確定專案中的哪些部分應該要採用不可變設計(immutable design)?預期能帶來哪些好處?如何驗證其效益?以及,如何判斷 AI 採取的作法是恰當的?

我認為,無論與 AI 工具的協作方式是 HOTL(Human-on-the-Loop)還是 HITL(Human-in-the-Loop),即便開發者連一行程式碼都不用寫,仍然需要具備「設計決策的判斷能力」。我希望這本書能在這方面提供一些幫助。

備註:HOTL 指 AI 自主執行工作,由人監督其運作,並在必要時介入;HITL 則將人的參與納入工作流程,例如由人審核 AI 的提案,確認後才執行下一步。

對有經驗的 C#/.NET 開發者而言,這也意味著重新思考熟悉的設計方式。物件導向仍有它的適用場景,而隨著 C# 語言版本的演進,以資料為中心的設計方式也越來越值得嘗試。

C# 的 record、init、模式比對,加上 .NET 的不可變集合,讓開發者更容易將資料與操作分開思考。然而,知道這些工具怎麼用,與理解它們能帶來什麼設計上的改變,仍有一段距離。我希望這本書能稍稍縮短這個距離。

蔡煥麟 (Michael Tsai)


目標讀者

本書適合已經具備 C# 開發經驗,並希望改善資料模型設計、API 設計與狀態管理方式的開發者。你不需要熟悉函數式程式設計,也不需要有進階型別理論背景,但應該已經了解 class、interface、nullable reference types、LINQ,以及 async/await 的基本用法。

你也不需要預先熟悉領域驅動設計(Domain-Driven Design, DDD)或特定的分層架構。本書會使用 domain model、application layer、repository 等常見名稱來說明不同程式碼的責任;這些概念會在第一次實際使用時簡短說明。若你曾接觸 Web API 與資料存取程式碼,閱讀相關範例會更容易,但這不是必要條件。

如果你曾經遇過以下情況,本書會特別有幫助:

  • 一個物件被多個方法或服務改來改去,最後很難確認資料是在哪裡被改壞的。
  • 知道 record、init、with 等語法,但不確定它們在設計上真正解決什麼問題。
  • 想讓 DTO、domain model、事件資料或查詢結果更容易測試與追蹤。
  • 想在不可變設計與現實框架限制之間取得平衡,例如 ORM、序列化、UI 資料繫結或效能敏感程式碼。

本書特色

本書以實務設計判斷為主,不把不可變資料當成單一教條。每個主題都會從常見的可變物件寫法開始,逐步改寫成更清楚的資料模型,並討論這樣做帶來的好處與代價。

本書的主要特色包括:

  • 以 C# 14 與 .NET 10 為基準:範例使用現代 C# 語法與標準函式庫,必要時會說明舊版 C# 或 .NET 的替代做法。少數章節的範例有用到 C# 15/.NET 11。
  • 從設計問題出發:不只介紹語法,而是說明何時該用 record、何時該用 class、何時該保留可變物件。
  • 重視可測試性與可追蹤性:透過不可變資料,讓狀態轉換更明確,也讓測試更容易驗證。
  • 討論限制與取捨:不可變資料不是免費的。本書也會說明效能、ORM、UI 資料繫結與深層資料更新等現實問題。
  • 提供完整範例程式:書中的程式碼可搭配 GitHub 範例專案閱讀與實作。

本書用到的工具

為了跟著本書實作練習,你需要準備:

  • .NET 11 SDK 或更新版本
  • 開發工具:Visual Studio 2026、Visual Studio Code、Rider,或其他支援 .NET 的編輯器/IDE