Recent Posts
C# Static Field 陷阱:在建構子中指派 this
這個專案示範了一個常見但危險的模式:在實例建構子(Instance Constructor)中將 this 指派給靜態欄位(Static Field)。這通常是為了方便全域存取「當前」物件,但往往會導致意想不到的錯誤。
核心問題 在 Person 類別中,我們看到這樣的程式碼:
public class Person { // 靜態欄位,所有實例共享同一個變數 public static Person CurrentPerson; public string Name; public Person(string name, int age) { Name = name; // ... CurrentPerson = this; // 每次 new 一個新物件,都會覆蓋這個靜態欄位! } } 發生了什麼事? 當你建立 Person A 時,CurrentPerson 指向 A。 當你建立 Person B 時,建構子再次執行,CurrentPerson 被更新指向 B。A 的全域參考就此遺失。 當你建立 Person C 時,CurrentPerson 再次被更新指向 C。 這意味著 Person.CurrentPerson 永遠只指向最後被建立的那個物件。如果你的系統依賴這個靜態屬性來存取「主要使用者」或「設定檔」,一旦程式的其他部分無意間建立了一個新的 Person 物件(例如暫時性的變數),原本的全域狀態就會被悄悄替換掉。
程式碼行為分析 執行 Program.cs 的輸出結果清楚地展示了這個現象:
read more
C# volatile 詳解:理解多執行緒可見性 (Memory Visibility)
當我們編寫多執行緒程式時,最容易被忽視的概念之一就是記憶體可見性 (Memory Visibility)。這個範例專案演示了在沒有適當同步機制的情況下,一個執行緒對變數的修改如何可能被另一個執行緒「視而不見」,以及 volatile 關鍵字如何解決這個問題。
核心問題:緩存與優化 現代 CPU 和編譯器為了效能,會做很多優化:
CPU 快取 (L1/L2 Cache):CPU 核心可能會將變數的值暫存在自己的快取中,而不是每次都去讀寫較慢的主記憶體 (RAM)。 指令重排 (Instruction Reordering):CPU 或編譯器可能會改變指令的執行順序以優化管線 (Pipeline)。 暫存器分配 (Register Allocation):編譯器 (JIT) 可能將變數直接存在 CPU 暫存器中,完全不寫回記憶體。 情境 A:沒有使用 volatile 在 WithoutVolatileDemo 類別中:
private bool _running = true; // 普通欄位 // Worker Thread while (_running) { /* ... */ } // Main Thread _running = false; 發生了什麼事?
Release 模式下,JIT 編譯器看到 while (_running) 迴圈內部沒有任何程式碼修改 _running。 它可能會將 _running 的值讀入 CPU 暫存器,並認為「這個值永遠不會變」。 於是迴圈變成了 while (true) 的死路。 即使主執行緒將記憶體中的 _running 改為 false,Worker 執行緒仍然在看它暫存器裡的舊值 (true)。 這就是可見性問題:主執行緒的寫入對 Worker 執行緒不可見。
read more
Speck-Kit:用 AI 驅動的規格化開發工作流
Speck-Kit 是一套規格化的專案管理框架,專為 AI 輔助軟體開發設計。它透過結構化的規格模板、分階段的開發流程,以及與 GitHub Copilot 深度整合的自訂 Agent,讓團隊在動手寫程式之前就能完成完整的需求釐清與技術規劃。本文以我的圖書管理系統(Library)專案為例,介紹 Speck-Kit 的核心概念與實際應用。
1. 什麼是 Speck-Kit? Speck-Kit(目前版本 v0.3.2)是一個開發流程的「元框架」,它不產出程式碼,而是定義如何產出程式碼。核心理念是:
在實作之前,先把需求寫清楚。
它提供了以下能力:
結構化規格模板:以 User Story、Acceptance Criteria、Gherkin 測試情境定義功能需求 分階段開發流程:Clarify → Specify → Plan → Implement → Tasks Copilot 自訂 Agent:每個階段對應一個專屬 Agent,共 9 個 PowerShell 自動化腳本:環境檢查、功能建立、計畫初始化 專案 Constitution:定義不可違反的品質、測試、效能標準 2. 安裝 Spec-Kit 官方 GitHub:https://github.com/github/spec-kit 前置需求 作業系統:Linux / macOS / Windows Python 3.11+:https://www.python.org/downloads/ Git:https://git-scm.com/downloads uv(Python 套件管理工具):https://docs.astral.sh/uv/ 支援的 AI 編碼助手(如 GitHub Copilot、Claude Code、Cursor 等) 安裝 Specify CLI 方式一:永久安裝(推薦) 安裝一次,隨處可用:
uv tool install specify-cli --from git+https://github.
read more