委托 是 <事件/回调函数> 的基础
1.最简单的委托
image.png
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate
{
delegate int NumberChanger(int num);
class Program
{
static int num = 1;
static void Main(string[] args)
{
NumberChanger nm = new NumberChanger(AddNum);
int a = nm(5);
Console.WriteLine(a);
nm = new NumberChanger(DecNum);
a = nm(5);
Console.WriteLine(a);
Console.ReadLine();
}
public static int AddNum(int p)
{
num += p;
return num;
}
public static int DecNum(int p)
{
num -= p;
return num;
}
}
}
2.multicasting delegate
有一个委托列表,按顺序执行,可以加减
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate
{
// Muti-casting delegate
delegate void D(int x);
class Program
{
static void Main(string[] args)
{
D fc1 = new D(C.FUNC1);
fc1(111);
D fc2 = new D(C.FUNC2);
fc2(222);
D fc3 = fc1 + fc2;
fc3(333);
Console.ReadLine();
}
}
class C
{
public static void FUNC1(int i)
{
Console.WriteLine("Func1: " + i);
}
public static void FUNC2(int i)
{
Console.WriteLine("Func2: " + i);
}
public void FUNC3(int i)
{
Console.WriteLine("Func3: " + i);
}
}
}
3.上述简易写法,直接 += 函数名
image.png
4.事件event
事件是一个修饰符,用来修饰Delegate实例,目的是让这个实例只能在声明该实例的类的内部触发
见下图:
image.png
image.png
image.png
image.png
5.回调函数
回调函数,其实就是通过代理,传递相同格式的函数指针,看了一个例子可以实现一种简单的适配器模式。
image.png
6.Action(无返回值格式代理简化版)/Func(有返回值格式代理简化版)
例:(Ps:Func泛型列表最后一个为返回值类型)
相对于直接调用委托,我更喜欢 .Invoke()方式,这让我能明确知道这是个委托
image.png
7.事件参数,通过lambda表达式,传递到监听者
image.png
image.png