C#回调函数

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

没什么好说的,就是这个函数的类型与参数要与代理一致

# 4. 连接信号槽

a.CallbackEvent += (b.Func);
1

用+=连接,把Func函数代理给CallbackEvent,当信号触发的时候执行这个Func函数

# 5. 触发信号测试

        public void Click()
        {
            CallbackEvent("wocaole");
        }
1
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