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

C++/CLI 委派與事件深度解析:從單播到多播、傳遞與排序實例

     編輯:VC 教學

委派基礎

委派是型別安全的函數包裝物件。宣告語法類似函數簽章,前加 delegate 關鍵字:

delegate int Del(int value); // 可包裝 int->int 的靜態/實例方法

建立與呼叫


ref struct A { static int Square(int i) { return i*i; } };
ref struct B { int Cube(int i) { return i*i*i; } };

Del^ d = gcnew Del(&A::Square);      // 靜態方法
Console::WriteLine(d(10));           // 100

B^ b = gcnew B;
d = gcnew Del(b, &B::Cube);          // 實例方法:傳實例控制碼 + 方法指標
Console::WriteLine(d(10));           // 1000

若委派為 nullptr 呼叫會拋 NullReferenceException。

多播委派

使用 +=、-= 組合/移除目標方法,呼叫時依序執行,回傳值為最後一個目標的回傳值:


d += gcnew Del(&A::Square);
d += gcnew Del(b, &B::Cube);
int result = d(3); // 先 Square(3)=9,再 Cube(3)=27,result=27

傳遞委派給方法:策略模式範例


delegate int Comparer(int x, int y);

int Ascending(int x, int y) { return x - y; }
int Descending(int x, int y) { return y - x; }

void Sort(array^ arr, Comparer^ cmp) {
    // 簡易氣泡排序,使用 cmp 決定順序
    for (int i=arr->Length-1; i>0; --i)
        for (int j=0; j 0) {
                int t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t;
            }
}

int main() {
    array^ a = {5,2,8,1};
    Sort(a, gcnew Comparer(Ascending));  // 1,2,5,8
    Sort(a, gcnew Comparer(Descending)); // 8,5,2,1
}

事件封裝

事件是委派的受限公開介面:外部只能 +=/-=,不能直接呼叫或清空:


ref class Counter {
    int value;
    event EventHandler^ Changed; // EventHandler = delegate void(Object^, EventArgs^)
public:
    property int Value {
        int get() { return value; }
        void set(int v) {
            if (value != v) {
                value = v;
                if (Changed != nullptr) Changed(this, EventArgs::Empty);
            }
        }
    }
};

void OnChanged(Object^ sender, EventArgs^ e) {
    Console::WriteLine("Value changed to {0}", safe_cast(sender)->Value);
}

int main() {
    Counter^ c = gcnew Counter;
    c->Changed += gcnew EventHandler(OnChanged);
    c->Value = 10; // 觸發事件
}

關鍵差異總結

特性委派事件
外部可呼叫是否
外部可指派 (=)是否(只能 +=/-=)
用途回呼、策略、非同步通知、觀察者模式
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved