C# 委托

2018-01-16 02:20 更新

C#委托

委托是調用方法的對象。我們可以認為委托是函數(shù)指針或函數(shù)類型。

委托類型定義委托實例可以調用的方法類型。

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

例子

下面定義一個稱為Converter的委托類型:

delegate int Converter (int x); 

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

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

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

Converter t = Square; 

其可以以與方法相同的方式被調用:

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

例2

這里是一個完整的例子:

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
實例充當調用者的委托:調用者調用delegate
,然后委托調用目標方法。

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


多播委托

一個委托實例可以引用多個目標方法。

+ + = 運算符合并了委托實例。

例如:

MyDelegate d = methodB; 
d += methodA; 

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

將按添加的順序調用代理。

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

d -= methodB; 

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

我們可以為委托分配一個空值:

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

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

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

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

實例 vs 靜態(tài)方法目標

當實例方法分配給委托對象時,委托對象維護方法所屬的方法和實例的引用。

System.Delegate 類的Target屬性表示此實例。

例如:

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);
    }
}
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號