一致的程式碼風格能大幅提升可讀性、可維護性與團隊協作效率。本文整理 C# 官方慣例與業界最佳實務,涵蓋命名規則、排版格式、註釋規範三大面向,並提供可直接套用的 EditorConfig 範例。
GetNextStudent() 優於 GetNextArrayElement()。Id, Xml, Http)。| 目標 | 慣例 | 範例 |
|---|---|---|
| 命名空間 | PascalCase | MyCompany.Products |
| 類別/結構/介面/列舉/委派 | PascalCase | CustomerService, IRepository |
| 公開/受保護欄位 | PascalCase | DefaultTimeout |
| 私有/內部欄位 | _camelCase | _connectionString |
| 方法/屬性/事件 | PascalCase | CalculateTotal(), OnChanged |
| 參數/區域變數 | camelCase | customerId, totalAmount |
| 常數/靜態唯讀公開欄位 | PascalCase | MaxRetryCount |
| 介面名稱 | I + PascalCase | IDisposable |
| 泛型型別參數 | T + PascalCase | TEntity, TKey |
| 非同步方法 | PascalCase + Async 尾綴 | GetDataAsync() |
Is、Has、Can、Should 前綴 → IsValid, HasChildren。Customers, OrderItems。On + 事件名 → OnClick, OnOrderCompleted。Handler 結尾 → EventHandler, ProgressHandler。Exception 結尾 → ValidationException。_)、匈牙利標記法。// Allman (推薦)
if (condition)
{
DoSomething();
}
// K&R
if (condition) {
DoSomething();
}
string sql = "SELECT Id, Name, Email, CreatedAt "
+ "FROM Customers "
+ "WHERE IsActive = 1 "
+ "ORDER BY CreatedAt DESC";
if (x)、method(arg) 關鍵字/方法名與括號間無空格。SELECT FirstName, LastName
FROM Customers
WHERE Region = 'WA'
AND IsActive = 1
ORDER BY LastName;
///
/// 依使用者編號取得完整姓名。
///
/// 使用者唯一識別碼,不可為 null。
/// 格式為「姓 名」的完整姓名;找不到時回傳空字串。
/// 為 null。
public string GetFullName(string userId)
{
if (userId == null) throw new ArgumentNullException(nameof(userId));
// ...
}
// TODO:, // HACK:, // NOTE:, // BUG: 標籤標記待辦/技術債。/* ... */ 或連續 //。**********)。若需要大量註釋才能理解的程式碼,優先考慮提煉方法、引入說明性變數、使用設計模式 重構,而非堆砌註釋。
在專案根目錄建立 .editorconfig,IDE (VS/VS Code/Rider) 將自動強制套用:
root = true
[*.cs]
indent_style = space
indent_size = 4
end_of_line = crlf
charset = utf-8-bom
trim_trailing_whitespace = true
insert_final_newline = true
# 命名規則
dotnet_naming_rule.interface_naming.severity = suggestion
dotnet_naming_rule.interface_naming.symbols = interface_symbols
dotnet_naming_rule.interface_naming.style = pascal_case_with_i_prefix
dotnet_naming_symbols.interface_symbols.applicable_kinds = interface
dotnet_naming_symbols.interface_symbols.applicable_accessibilities = public,internal
dotnet_naming_style.pascal_case_with_i_prefix.capitalization = pascal_case
dotnet_naming_style.pascal_case_with_i_prefix.required_prefix = I
# 公開成員需 XML 註釋
dotnet_diagnostic.CS1591.severity = warning
# 框架建議
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_prefer_simple_default_expression = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
| 項目 | 檢查重點 |
|---|---|
| 命名 | Pascal/camel 一致性、無縮寫、布林前綴、介面 I 開頭 |
| 格式 | 4 空格縮排、大括號風格統一、行長 ≤120、運算子空格 |
| 註釋 | 公開 API 有 XML 註釋、行內註釋解釋 Why、無廢棄註釋 |
| 架構 | 方法單一職責、類別內聚、介面隔離、依賴倒置 |
| 效能 | 避免迴圈內字串串接、正確使用 StringBuilder、非同步無死鎖 |
| 安全 | 參數驗證、SQL 參數化、敏感資料不硬編碼、輸入編碼輸出 |