C# 委托与事件

委托

委托的声明

委托实际上是一个函数(或叫方法)的引用。

声明委托与声明一个函数类似,需要在类型前面添加关键字delagate,例如

public delegate void SaySomething(string msg);

这便声明了一个委托,要注意的是,其类型和参数与被引用函数的返回类型和参数要一致。比如下面这2个被引用函数:

public void SayHello(string name)
{
    Console.WriteLine("Hello " + name);
}
public void SayBye(string name)
{
    Console.WriteLine("Good Bye " + name);
}

委托的实例化与使用

实例化一个委托很简单,与实例化一个类相似,下面便实例化了2个委托:

SaySomething sayHello = new SaySomething(SayHello);
SaySomething sayBye = new SaySomething(SayBye);

实例化后就能像函数一样进行使用了:

sayHello("Bob");
sayBye("Alice");

注意:从以上可以看出,委托是一种特殊的类型。

事件

创建事件

事件不是类型,使用事件时直接创建一个事件即可,事件的创建需要用到委托(和关键字event),也就是事件的类型是我们或者别人事先声明的委托,如:

public delegate void SaySomething(string msg);  // 声明一个委托
public event SaySomething E_SaySomething;       // 创建一个SaySomething事件

把委托添加到事件中,这样“事件”发生时就会通过委托调用相应的函数:

SaySomething sayHello = new SaySomething(SayHello);
SaySomething sayBye = new SaySomething(SayBye);
E_SaySomething += sayHello;  // 把委托添加到事件
E_SaySomething += sayBye;    // 把另一个委托添加到事件

通常一个事件发生时我们只完成一个委托(即执行一个函数)即可,上面我们希望该事件发生时完成2个委托(分别是sayHello和sayBye)。

上面代码也可以简写(不创建委托实例,直接把函数添加到事件即可):

E_SaySomething += SayHello;  // 注意SayHello是函数名
E_SaySomething += SayBye;

触发事件

可理解为事件发生时,完成与该事件关联的委托或函数。

E_SaySomething("Bob");

输出如下:
image-20240313133411281

完整代码

namespace zzz_delegate_event
{
    class EventTest
    {
        public delegate void SaySomething(string msg);
        public event SaySomething E_SaySomething;
        public void SayHello(string name)
        {
            Console.WriteLine("Hello " + name);
        }
        public void SayBye(string name)
        {
            Console.WriteLine("Good Bye " + name);
        }
        
        public void testDelegateEvent()
        {
            
            //SaySomething sayHello = new SaySomething(SayHello);
            //SaySomething sayBye = new SaySomething(SayBye);
            //E_SaySomething += sayHello;
            //E_SaySomething += sayBye;

            // 或简写为2行
            E_SaySomething += SayHello;
            E_SaySomething += SayBye;
            E_SaySomething("Bob");
            //E_SaySomething("Alice");

        }

    }
    
    internal class Program
    {
        
        static void Main(string[] args)
        {
            EventTest eTest = new EventTest();
            eTest.testDelegateEvent();
        }
    }
}

其它

在使用winform或WPF写桌面程序时,经常使用到事件,这是怎么实现的呢?

实际上,这些事件.Net框架已经帮我们创建好了(委托也声明好了),我们只需要编写一个函数(函数的返回类型、参数要与委托一致),然后把这些函数关联到相应的事件即可,这样事件触发时,就会执行我们定义的函数。

posted @ 2024-03-13 13:48  aJream  阅读(11)  评论(0编辑  收藏  举报