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

C# 委派深度解析:宣告、實例化、呼叫、多播與型別相容性

     編輯:關於C語言

委派三步驟

  1. 宣告:定義委派型別,指定參數與回傳型別。
  2. 實例化:用 new DelegateType(MethodName) 綁定目標方法。
  3. 呼叫:像呼叫方法一樣呼叫委派實例。

基本範例

using System;

delegate int Compute(int left, int right); // 1. 宣告

class A
{
    public int Mul(int x, int y) => x * y; // 實例方法
}

class Test
{
    public static int Add(int x, int y) => x + y; // 靜態方法

    static void Main()
    {
        Compute c1 = new Compute(Add);     // 靜態方法實例化
        A a = new A();
        Compute c2 = new Compute(a.Mul);   // 實例方法實例化

        int r1 = c1(2, 3); // 5
        int r2 = c2(2, 3); // 6
        Console.WriteLine($"{r1}, {r2}");
    }
}

委派相容性規則

兩個委派型別相同指名稱相同;委派實例相等指綁定相同方法鏈。型別相容需滿足:

  1. 參數數量、型別、順序完全相同。
  2. 回傳型別相同。

實例化時,目標方法簽章需與委派型別相容(支援協變/逆變:C# 2.0+ 允許方法回傳型別為委派回傳型別的衍生類別,參數型別為委派參數型別的基類別)。

委派多播

  • 回傳型別必須為 void。
  • +/+= 組合,-/-= 移除。
  • 呼叫順序 = 組合順序。
  • 移除以「委派實例」為單位,從鏈尾向前搜尋。
delegate void MyDelegate(string s);

static void Hello(string s) => Console.WriteLine($"Hello, {s}!");
static void Goodbye(string s) => Console.WriteLine($"Goodbye, {s}!");

static void Main()
{
    MyDelegate a = Hello, b = Goodbye;
    MyDelegate c = a + b;      // Hello -> Goodbye
    MyDelegate d = c - a;      // 僅剩 Goodbye

    a("A"); // Hello, A!
    b("B"); // Goodbye, B!
    c("C"); // Hello, C! -> Goodbye, C!
    d("D"); // Goodbye, D!

    // 進階組合/移除
    MyDelegate e = a + b + a;  // Hello, Goodbye, Hello
    b += b;                    // b 變成 Goodbye, Goodbye
    MyDelegate f = e - b;      // 移除最後一個 Goodbye, Goodbye -> 剩 Hello, Goodbye, Hello
}

現代 C# 慣用寫法

  • 省略 new DelegateType(...),直接指派方法群組:Compute c = Add;
  • 內建泛型委派:Func<T, TResult>、Action<T>、Predicate<T>,減少自訂委派型別。
  • Lambda 運算式:Compute c = (x, y) => x + y;
  • 事件模式請用 EventHandler<TEventArgs>。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved