首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 編碼標準:程式設計習慣與最佳實務 66 條完整指南

     編輯:關於C語言

檔案與類別組織

  1. 單一檔案單一類別
  2. 單一檔案單一命名空間
  3. 檔案行數 ≤ 500 (不含設計器代碼)
  4. 方法行數 ≤ 25
  5. 方法參數 ≤ 5,超過請用結構/類別封裝
  6. 行寬 ≤ 80~120 字元
  7. 不手動修改設計器代碼,善用 partial 分離

註解與文件

  1. 避免解釋顯而易見的代碼,程式碼應自述性
  2. 僅記錄操作假設、演算法洞見、副作用
  3. 避免方法級文件,改用 XML 註解 (///) 供 IntelliSense
  4. 公開 API 必須有 XML 註解

常數與魔術數字

  1. 消除魔術數字,改用 const/readonly/建構子注入
  2. const 僅用於真正不變的自然常數 (如 DaysInWeek = 7)
  3. 執行期才定值的「常數」用 readonly

斷言與測試

  1. 平均每 15 行一個 Debug.Assert 驗證前置/後置條件
  2. 每行代碼需經白箱測試覆蓋

例外處理

  1. 僅拋出已處理的例外,避免 throw new Exception()
  2. catch 區塊重拋時用 throw; 保留堆疊 (非 throw ex;)
  3. 避免用回傳碼表示錯誤,改用例外
  4. 極少自訂例外;若必要,繼承 ApplicationException 並實作序列化

組件設計

  1. 單一進入點 (Main),EXE 極小化,業務邏輯移至類別庫
  2. 預設 internal,僅公開必要 API
  3. 避免 InternalsVisibleTo (增加組件耦合)
  4. 避免依賴組件載入路徑

列舉設計

  1. 不指定明確值,由編譯器自動遞增
  2. 不指定底層型別 (預設 int)

控制流程

  1. if 區塊永遠用大括號,即使單行
  2. 避免三元運算子 ?: (除非極簡單)
  3. 條件判斷先存入布林變數,再判斷變數 (利除錯、可讀性)
  4. 陣列永遠 0-based
  5. 迴圈中顯式初始化參考型別陣列元素

封裝與繼承

  1. 無 public/protected 欄位,改用屬性
  2. 覆寫基類成員用 override,非 new
  3. 非 sealed 類別的 public/protected 方法標記 virtual

非安全代碼與轉型

  1. 除非 Interop,否則禁用 unsafe
  2. 優先用 as 搭配 null 檢查,避免直接轉型拋例外

委派與事件

  1. 引發事件前複製委派到區域變數,避免競態
  2. 引發前檢查 != null (或 ?.Invoke)
  3. 事件使用 add/remove 存取器封裝委派欄位
  4. 考慮使用 EventHandlerList 管理大量事件

介面設計

  1. 優先使用介面定義契約
  2. 介面方法/屬性比例 ≥ 2:1
  3. 避免單一成員介面
  4. 介面成員 3~5 個為宜,上限 20 (實際建議 ≤ 12)
  5. 介面不含事件
  6. 以介面取代抽象基類
  7. 類別繼承鏈中顯式實作介面
  8. 防禦性查詢介面:obj as IInterface + null 檢查

字串與資源

  1. UI 字串使用資源檔 (.resx),不硬編碼
  2. 連線字串等設定值用設定檔 (appsettings.json/web.config)
  3. 大量拼接用 StringBuilder

結構體

  1. 避免在結構定義方法,改用建構子/運算子多載

靜態建構子

  1. 靜態欄位若有初始化邏輯,提供靜態建構子

繫結與診斷

  1. 優先早期繫結 (編譯期型別檢查)
  2. 使用 Trace/Debug 記錄診斷資訊

其他

  1. goto 僅用於 switch fall-through
  2. switch 必須有 default 配合 Debug.Assert(false)
  3. this 僅用於建構子鏈結 (: this(...))
  4. base 僅用於呼叫基類建構子/覆寫成員
  5. 實作 IDisposable 模式 (Dispose/Finalize)
  6. 避免 object 裝箱/拆箱,用泛型約束或 as
  7. 介面不加型別約束,改用強型別介面繼承 (如 ICustomerList : IList<Customer>)
  8. 介面成員不加存取修飾詞 (預設 public)
  9. 優先使用 .NET 內建泛型集合 (List<T>, Dictionary<TKey,TValue>)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved