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

C# 程式碼審查清單 39 條:從異常處理到執行緒安全的完整指南

     編輯:關於C語言

異常與錯誤處理

  • ✅ 以異常表示錯誤,而非回傳狀態碼/錯誤碼
  • ✅ 方法參數必須驗證,非法參數拋 ArgumentException 衍生型別
  • ✅ 用 Debug.Assert 驗證前置條件(如「j 必為正數」),取代註解
  • ✅ finally 區塊包裝必須執行的清理邏輯
  • ✅ 自訂異常類別:
    — 提供 (string message) 與 (string, Exception inner) 建構子
    — 繼承自專案基底異常,納入異常階層
    — 標記 [Serializable] 並實作 ISerializable(跨 AppDomain/遠端需求)

類別設計與封裝

  • ✅ 不需實例化的類別(工具類、單例)標記 private 建構子
  • ✅ 僅作為方法參數/回傳值/集合元素的類別,考慮 struct(值型別)
  • ✅ 組件內部類別/方法/事件標記 internal
  • ✅ 單例於多執行緒環境採雙重檢查鎖定或 Lazy<T> 初始化
  • ✅ 必須被衍生類覆寫的方法標記 abstract;不應被覆寫的類別/方法標記 sealed
  • ✅ 覆寫方法必加 override 關鍵字(防止簽名錯誤)
  • ✅ 介面優於抽象類別;依賴介面而非具體實作
  • ✅ 實作 IDisposable 模式(Dispose(bool) + 終結器)釋放非託管資源
  • ✅ using 區塊確保 IDisposable 物件確定性釋放

型別轉換與相等性

  • ✅ 可能失敗的向下轉型用 as + null 檢查,避免 InvalidCastException
  • ✅ 覆寫 ToString() 供診斷輸出,勿另寫 Dump()
  • ✅ 覆寫 Equals 時:
    — 必須同步覆寫 GetHashCode(語意一致、利用成員變數、回傳不變雜湊碼)
    — 若覆寫 ==/!=,內部轉呼叫 Equals

泛型、委派與事件

  • ✅ 委派回傳 void,避免 out/ref 參數
  • ✅ 事件模式:sender 為第一參數,EventArgs 衍生類唯讀
  • ✅ 以 event 關鍵字發布委派,防止外部直接觸發

並行與同步

  • ✅ lock 取代 Monitor.Enter/Exit(語法糖含 try/finally)
  • ✅ 執行緒喚醒用 Monitor.Pulse/PulseAll 或事件,禁用 Thread.Sleep 忙等待

數值運算與序列化

  • ✅ 浮點運算常數皆用 double(如 1.0 而非 1),避免隱性整數除法
  • ✅ 跨 AppDomain/遠端類別標記 [Serializable] 並有預設建構子(含 Exception/EventArgs 衍生類)
  • ✅ 顯式實作 ISerializable 需同時提供 GetObjectData 與 (SerializationInfo, StreamingContext) 建構子

單元測試

  • ✅ 共用建構/拆解邏輯置於 [SetUp]/[TearDown]
  • ✅ 負面測試用 [ExpectedException] 驗證異常拋出

文件註解與日誌

  • ✅ 所有 public 類別/方法採 XML 文件註解(///),<summary> 描述「做什麼」,<remarks> 或行內註解說明「怎麼做」
  • ✅ 日誌輸出導向紀錄元件(log4net/Serilog/NLog),禁用 Console.WriteLine
  • ✅ foreach 優於 for(int i...);屬性取代 Getter/Setter 方法
  • ✅ 唯讀欄位(readonly)優於無 setter 的屬性

使用建議

將此清單整合至 PR 模板或靜態分析規則集,逐項核對可攔截 80% 以上常見缺陷。團隊可依專案屬性裁剪(如無序列化需求可移除相關項),但核心原則——顯式優於隱式、失敗快速、資源確定性釋放——應貫穿始終。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved