C#---委托(delegate)

委托 — 回调(并且可为回调集合, 即可同时设置多个回调)
委托 — 函数指针(多种出处, 包括微软VS自带的C#教程)

应用场景:
委托一般都使用在 Observer模式(观察者模式)。

Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。
Observer模式主要包括如下两类对象:
被监视对象:往往包含着其他对象所感兴趣的内容。
监视者:当对象中的某件事发生的时候,会告知建设者,而建设者则会采取相应的行动。

即 在数据产生时, 调用已注册的回调函数


声明委托:

  1. delegate
    public delegate int TestDelegate(int x, int y);

  2. Action

    Action是无返回值的泛型委托。
    Action 表示无参,无返回值的委托
    Action<int,string> 表示有传入参数int,string无返回值的委托

3 Func

Func是有返回值的泛型委托
Func 表示无参,返回值为int的委托
Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

4 predicate

predicate 是返回bool型的泛型委托
predicate 表示传入参数为int 返回bool的委托。

5 四者之间的区别

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型
Action至少1个参数,至多4个参数,无返回值,
Func至少0个参数,至多4个参数,根据返回值泛型返回。必须有返回值,不可void
Predicate至少1个参数,至多1个参数,返回值固定为bool

Tips: 个人感觉 因为仅参数列表来确定, 则使用delegate即可(在当前的初识阶段)


定义委托的语法:

delegate <return type> <delegate-name> <parameter list>

1
2
3
4
5
实例委托:
public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);

是不是委托可以理解为 “typedef”的函数指针? (只要返回值和参数列表正确, 则均可被委托, 与函数是否为Static修饰无关)

委托既可以引用静态方法(例如前一示例中的 Square 或 Math.Sin),也可以引用实例方法(例如前一示例中的 m.Multiply)。引用了实例方法的委托也就引用了一个特定的对象,当通过该委托调用这个实例方法时,该对象在调用中成为 this。
也可以使用匿名函数创建委托,这是即时创建的“内联方法”。匿名函数可以查看外层方法的局部变量。因此,可以在不使用 Multiplier 类的情况下更容易地写出上面的乘法器示例:
double[] doubles = Apply(a, (double x) => x * 2.0);
委托的一个有趣且有用的属性在于,它不知道也不关心它所引用的方法的类;它仅关心所引用的方法是否与委托具有相同的参数和返回类型。

  delegate void IntMethod(int x);//定义了一个委托IntMethod,指定该委托的每个实例都可以包含一个或多个方法的引用,引用的方法必须带有一个int参数,并返回void.

  因为定义委托基本上是定义一个新类,所以可以在定义类的任何地方定义委托。也可以在委托的定义上使用修饰符:public,private,protected等。

文章目录
  1. 1. 声明委托:
  2. 2. 定义委托的语法:
|