微軟規畫調整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>說明撰寫與安全條件判斷仍需由開發者完成
衍生頁面
- unsafe語意強化記憶體安全責任揭露 — 主要概念頁面
- microsoft — 微軟(.NET 團隊)