C#回调函数
furrain 5/15/2022 UnityCSharp
# C#回调
# 简介
因为平时使用Qt进行开发,所以下面的说明类比Qt中的回调,信号槽机制
# 1. 使用代理声明函数类型
public delegate void AsyncCallback(string str);
1
声明一个参数是string类型的名字叫AsyncCallback代理
有时候你可能看不到这个声明,因为他可能使用了一个叫Action的代理,在C#的默认包System里面
public delegate void Action();
1
# 2. 用此代理声明一个信号
public event AsyncCallback CallbackEvent;
1
这个就是声明了一个叫CallbackEvent的信号。
# 3. 写一个与代理形式相同的槽函数
public void Func(string str)
{
Console.WriteLine("from B :" + str);
}
1
2
3
4
2
3
4
没什么好说的,就是这个函数的类型与参数要与代理一致
# 4. 连接信号槽
a.CallbackEvent += (b.Func);
1
用+=连接,把Func函数代理给CallbackEvent,当信号触发的时候执行这个Func函数
# 5. 触发信号测试
public void Click()
{
CallbackEvent("wocaole");
}
1
2
3
4
2
3
4
# 测试代码
namespace Project1
{
public delegate void AsyncCallback(string str);
class A
{
// 类比Qt 的信号
public event AsyncCallback CallbackEvent;
// 发送信号
public void Click()
{
CallbackEvent("wocaole");
}
}
class B
{// 类比Qt的槽函数
public void Func(string str)
{
Console.WriteLine("from B :" + str);
}
}
class C
{
public void Func(string str)
{
Console.WriteLine("from C :" + str);
}
}
class Test
{
public static void Main(string[] argv)
{
A a = new A();
B b = new B();
C c = new C();
// 类比Qt的 连接信号槽
a.CallbackEvent += (b.Func);
a.CallbackEvent += (c.Func);
a.Click();
Console.Read();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46