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

IDesign C# 編程規範(三):介面設計、泛型與資源管理進階準則

     編輯:關於C語言

前言

本文為系列第三部分,涵蓋第 34-66 條規範,聚焦繼承與多型、介面設計、泛型使用、資源管理、除錯支援等進階主題。

繼承與多型規範

#規範說明
34避免 new 隱藏,用 override明確表達多型意圖
35非密封類別的 public/protected 方法標記 virtual預設可擴展,封裝變化點
36除非互操作,禁用 unsafe類型安全優先
37避免強制轉型,用 as 防禦性轉型失敗回傳 null 而非拋例外

as 防禦性轉型範例

Dog dog = new GermanShepherd();
GermanShepherd shepherd = dog as GermanShepherd;
if (shepherd != null) { ... }

委派與事件模式

#規範關鍵點
38委派發佈前複製到區域變數避免並發競態
38b調用前檢查 null標準事件引發模式
39不用 public 事件欄位,用事件存取器封裝增減訂閱邏輯
40用 EventsHelper 安全發佈事件參考 Programming .NET Components

標準事件引發模式

public class MySource {
    public event EventHandler MyEvent;
    public void FireEvent() {
        EventHandler temp = MyEvent;  // 複製避免競態
        if (temp != null)
            temp(this, EventArgs.Empty);
    }
}

事件存取器封裝

public class MySource {
    MyDelegate m_SomeEvent;
    public event MyDelegate SomeEvent {
        add { m_SomeEvent += value; }
        remove { m_SomeEvent -= value; }
    }
}

介面設計鐵律

#規範說明
41永遠使用介面參考 Programming .NET Components Ch1,3
42方法/屬性比 ≥ 2:1行為豐富於資料
43避免單一成員介面除非標記介面
44介面成員數 3-5 為宜單一職責、內聚度高
45介面成員 ≤ 20(實際極限 ~12)過大即拆分
46避免事件作為介面成員事件屬實作細節
47避免抽象方法,用介面替代介面更靈活、支援多實作
48類別階層暴露介面參考 Ch3
49優先使用明確介面實作參考 Ch3,避免命名衝突
50防禦性查詢介面支援用 as 檢查,勿假設

防禦性介面查詢

SomeType obj1 = GetObject();
IMyInterface obj2 = obj1 as IMyInterface;
if (obj2 != null) {
    obj2.Method1();
} else {
    // 處理不支援介面情況
}

字串與資源管理

#規範
51面向使用者字串用資源檔,禁硬編碼
52部署相關字串(連線字串等)用設定檔
53長字串建構用 StringBuilder

結構體設計

#規範
54避免在結構體定義方法
54a參數化建構子鼓勵使用
54b運算子多載允許

靜態建構與繫結

#規範
55提供靜態欄位時,必提供靜態建構子
56優先早期繫結,避免晚期繫結

診斷與流程控制

#規範
57應用程式啟用日誌與追蹤
58禁用 goto(switch fall-through 除外)
59switch 必有 default + Assert

switch 防禦性預設

int number = SomeMethod();
switch (number) {
    case 1: Trace.WriteLine("Case 1"); break;
    case 2: Trace.WriteLine("Case 2"); break;
    default: Debug.Assert(false); break;
}

this / base 使用限制

#規範
60僅在建構子鏈呼叫另一建構子時用 this
61僅解決名稱衝突或呼叫基底建構子時用 base

正確 this 用法

public class MyClass {
    public MyClass(string message) { }
    public MyClass() : this("hello") { }  // 建構子鏈
}

正確 base 用法

public class GermanShepherd : Dog {
    public GermanShepherd(string name) : base(name) { }  // 基底建構子
    public override void Bark(int howLong) {
        base.Bark(howLong);  // 基底實作延伸
    }
}

Dispose/Finalize 模式

#規範
62依 Programming .NET Components Ch4 模板實作

泛型最佳實踐

#規範範例
63泛型代碼避免與 Object 轉型,用約束或 aswhere T : SomeClass
64泛型介面不定義約束,用強型別介面繼承ICustomerList : IList<Customer>
65介面中不定義方法層級約束
66資料結構優先使用泛型List<T> 而非 ArrayList

泛型約束正確範例

// 避免
class MyClass {
    void SomeMethod(T t) {
        object temp = t;
        SomeClass obj = (SomeClass)temp;  // 裝箱+轉型開銷
    }
}

// 正確:型別約束
class MyClass where T : SomeClass {
    void SomeMethod(T t) {
        SomeClass obj = t;  // 直接指派,零開銷
    }
}

介面約束替代方案

// 避免:介面層級約束
public interface IList where T : Customer { ... }

// 正確:強型別介面繼承
public interface ICustomerList : IList { ... }

總結

第三部分規範深入核心架構決策:介面導向設計、委派/事件執行緒安全、泛型型別系統善用、資源確定性釋放。這些準則直接決定系統的擴充性、穩定度與效能上限。建議列入程式碼審查核心清單,並以 Roslyn Analyzer 自動化執行關鍵規則(如 Dispose 模式、泛型約束、介面設計)。

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