C# 委托

2018-01-16 02:20 更新

C#委托

委托是调用方法的对象。我们可以认为委托是函数指针或函数类型。

委托类型定义委托实例可以调用的方法类型。

委托类型定义方法的返回类型及其参数类型。

例子

下面定义一个称为Converter的委托类型:

delegate int Converter (int x); 

Converter 与任何方法与 int 返回类型和单个 int 参数兼容,如:

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

将一个方法分配给一个委托变量创建一个委托实例:

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函数指针。


多播委托

一个委托实例可以引用多个目标方法。

+ + = 运算符合并了委托实例。

例如:

MyDelegate d = methodB; 
d += methodA; 

调用d现在将调用 methodB methodA

将按添加的顺序调用代理。

- -=
运算符从左代表中删除正确的代理操作数操作数。 例如:

d -= methodB; 

调用 d 现在将仅调用 methodA

我们可以为委托分配一个空值:

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

如果多播委托具有非void返回类型,则调用者从最后一个要调用的方法接收返回值。

前面的方法仍然被调用,但是它们的返回值被丢弃。

所有委托类型隐含地派生自System.MulticastDelegate,它继承自 System.Delegate

实例 vs 静态方法目标

当实例方法分配给委托对象时,委托对象维护方法所属的方法和实例的引用。

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

公众号
微信公众号

编程狮公众号