前言
本文為系列最終部分,對應 IDesign 規範第三章:專案設定與專案結構 23 條準則,涵蓋建置配置、版本管理、原始碼組織、簽名部署等工程化議題。
建置配置鐵律
| # | 規範 | 說明 |
| 1 | 警告等級 4 | 最嚴格檢查 |
| 2 | Release 視警告為錯誤 | Debug 建議同樣啟用 |
| 3 | 禁用 #pragma warning disable | 不抑制特定編譯警告 |
| 13 | 預設 unchecked,溢位風險區塊用 checked | 效能與正確性平衡 |
| 21 | Release 保留偵錯符號 | 支援生產環境診斷 |
Checked 區塊範例
int CalcPower(int number, int power) {
int result = 1;
for (int count = 1; count <= power; count++) {
checked { result *= number; } // 僅乘法溢位檢查
}
return result;
}
執行階段與組件版本
| # | 規範 |
| 4 | app.config 明確宣告 supportedRuntime |
| 5 | 避免自訂版本重導向與繫結 |
| 15 | 同一邏輯應用程式統一版本號 |
| 22 | 所有組件簽名(含用戶端 EXE) |
| 23 | 互操作組件用專案 SNK 簽名 |
app.config 範例
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/>
<supportedRuntime version="v1.1.4322"/>
</startup>
</configuration>
條件編譯與組件屬性
| # | 規範 |
| 6 | 避免 #define,用專案設定定義條件編譯常數 |
| 7 | AssemblyInfo.cs 無邏輯程式碼 |
| 8 | 組件屬性僅放 AssemblyInfo.cs |
| 9 | 填寫所有組件屬性欄位(公司、描述、版權等) |
| 17 | 避免 #if/#endif 排除呼叫,用 ConditionalAttribute |
ConditionalAttribute 範例
public class MyClass {
[Conditional("MY_SPECIAL_CONDITION")]
public void MyMethod() { }
}
專案結構與原始碼組織
| # | 規範 |
| 10 | 組件參考用相對路徑 |
| 11 | 禁止循環參考 |
| 12 | 避免多模組組件 |
| 16 | 應用程式設定檔命名 App.config 並納入專案 |
| 18 | 修改 VS 預設結構為標準佈局,統一資料夾/檔案組織 |
| 19 | 方案層級共享資訊連結至全域共享檔案 |
| 20 | Tab 設為 3 空白(Tools → Options → Text Editor → C# → Tabs) |
除錯與例外處理配置
| # | 規範 |
| 14 | 避免使用例外視窗 (Debug|Exceptions) 竄改例外處理 |
完整建置流程檢查清單
- ☐ Warning Level 4
- ☐ Treat Warnings as Errors (Release + Debug)
- ☐ 無 #pragma warning disable
- ☐ app.config 含 supportedRuntime
- ☐ 無自訂版本重導向
- ☐ 條件編譯常數在專案屬性定義
- ☐ AssemblyInfo.cs 完整且無邏輯
- ☐ 相對路徑組件參考
- ☐ 無循環參考
- ☐ 無多模組組件
- ☐ 預設 unchecked,關鍵運算 checked
- ☐ 不竄改例外視窗設定
- ☐ 統一版本號策略
- ☐ App.config 納入專案
- ☐ ConditionalAttribute 替代 #if
- ☐ 標準專案目錄結構
- ☐ 全域共享檔案連結
- ☐ Tab = 3 空白
- ☐ Release 含 PDB
- ☐ 所有組件強名簽名
- ☐ 互操作組件同 SNK 簽名
總結
這 23 條規範將「專案設定」提升為工程紀律:從編譯器嚴格度、版本治理、原始碼組織到部署簽名,構建可重現、可診斷、可演進的建置管線。關鍵在於自動化強制執行:將規範編碼為 Directory.Build.props、.editorconfig、CI 管線品質閘門,而非依賴人工審查。配合前三部分的編碼規範,形成完整的 C# 工程品質體系。