C# 委托

2018-01-16 02:20 更新

C#委托

委托是調(diào)用方法的對(duì)象。我們可以認(rèn)為委托是函數(shù)指針或函數(shù)類型。

委托類型定義委托實(shí)例可以調(diào)用的方法類型。

委托類型定義方法的返回類型及其參數(shù)類型。

例子

下面定義一個(gè)稱為Converter的委托類型:

delegate int Converter (int x); 

Converter 與任何方法與 int 返回類型和單個(gè) int 參數(shù)兼容,如:

static int Square (int x) { return x * x; } 

將一個(gè)方法分配給一個(gè)委托變量創(chuàng)建一個(gè)委托實(shí)例:

Converter t = Square; 

其可以以與方法相同的方式被調(diào)用:

int answer = t(3); // answer is 9 

例2

這里是一個(gè)完整的例子:

delegate int Converter (int x); 

class Test { 
    static void Main() { 
        Converter t = Square; // Create delegate instance 
        int result = t(3);    // Invoke delegate 
        Console.WriteLine (result); // 9 
    }
    static int Square (int x) { return x * x; } 
} 

delegate
實(shí)例充當(dāng)調(diào)用者的委托:調(diào)用者調(diào)用delegate
,然后委托調(diào)用目標(biāo)方法。

委托類似于C函數(shù)指針。


多播委托

一個(gè)委托實(shí)例可以引用多個(gè)目標(biāo)方法。

+ + = 運(yùn)算符合并了委托實(shí)例。

例如:

MyDelegate d = methodB; 
d += methodA; 

調(diào)用d現(xiàn)在將調(diào)用 methodB methodA 。

將按添加的順序調(diào)用代理。

- -=
運(yùn)算符從左代表中刪除正確的代理操作數(shù)操作數(shù)。 例如:

d -= methodB; 

調(diào)用 d 現(xiàn)在將僅調(diào)用 methodA 。

我們可以為委托分配一個(gè)空值:

MyDelegate d = null; 
d += methodB; // Equivalent (when d is null) to d = methodB; 

如果多播委托具有非void返回類型,則調(diào)用者從最后一個(gè)要調(diào)用的方法接收返回值。

前面的方法仍然被調(diào)用,但是它們的返回值被丟棄。

所有委托類型隱含地派生自System.MulticastDelegate,它繼承自 System.Delegate 。

實(shí)例 vs 靜態(tài)方法目標(biāo)

當(dāng)實(shí)例方法分配給委托對(duì)象時(shí),委托對(duì)象維護(hù)方法所屬的方法和實(shí)例的引用。

System.Delegate 類的Target屬性表示此實(shí)例。

例如:

public delegate void Printer (int percentComplete);

class Test {
    static void Main() {
        X x = new X();
        Printer p = x.methodA;
        p(1);
        Console.WriteLine (p.Target == x); // True
        Console.WriteLine (p.Method); // Void methodA(Int32)
    }
}
class X {
    public void methodA (int percentComplete) {
        Console.WriteLine (percentComplete);
    }
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)