微軟規畫調整C# unsafe語意,強化記憶體安全責任揭露

來源: iThome | 日期: 2026-05-26 URL: https://www.ithome.com.tw/news/176140 Blog ID: 599

核心變更

微軟 .NET 團隊計畫調整 C# 處理 unsafe 程式碼的設計,讓記憶體安全責任更明確地呈現在程式碼中,並由編譯器協助驗證。

時程規劃

階段版本
預覽.NET 11(C# 16)
正式推出.NET 12
初期啟用方式專案層級選擇性啟用
未來方向可能成為預設模式

新舊模型差異

  • 舊模型unsafe 僅用於開啟指標語法的使用範圍
  • 新模型unsafe 標示「編譯器無法自行驗證記憶體安全條件」的程式碼,將安全義務明確傳遞給呼叫端

主要規則變更

  • 每個不安全操作必須放在明確的 unsafe 區塊內(呼叫不安全方法、讀寫指標記憶體等)
  • 若方法內部能自行處理風險 → 對外仍可一般呼叫
  • 若無法自行處理 → 必須將責任傳遞給呼叫端,呼叫端也需使用 unsafe 區塊

API 影響範例

  • Marshal.ReadByte(透過 IntPtr 讀取記憶體)等 API,新模型要求更清楚揭露呼叫端需確保的條件(如指標與位移量相加後必須指向有效且有權讀取的記憶體)

安全註解慣例

  • 不安全成員應附上安全說明,寫明呼叫端必須滿足的條件
  • 方法內部可用註解說明開發者如何確認不安全操作的前提已成立
  • 分析器可協助找出缺少安全說明的情況

技術特性

  • 編譯期規則變更,不新增執行期檢查
  • 不影響效能
  • ❌ 違規結果為編譯錯誤(非警告)

遷移支援

  • .NET 執行期函式庫將採用新模型
  • 微軟計畫提供工具協助既有專案進行機械式調整
  • <safety> 說明撰寫與安全條件判斷仍需由開發者完成

衍生頁面