欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C# 事件

程序员文章站 2022-03-25 10:29:39
...

C# 事件

事件简介

Microsoft Docs上的解释
事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式。 任何其他组件都可以订阅事件,并在事件引发时得到通知。

这样说比较抽象,打个比方:你有一只看门狗,如果小偷来了,你的狗会叫,你听到狗叫就会起来抓小偷,这就是狗向你广播小偷来了这件事。

事件的特点

  1. 事件有三个要素:事件拥有者事件订阅者事件处理方法
  • 事件拥有者:也叫事件发布者,个人觉得用拥有者更方便理解,很显然,谁定义事件谁就是事件的拥有者。具体到代码中也就是哪个类中定义了的事件,那么这个类的实例就是事件的拥有者。
  • 事件订阅者:可理解为“盯着”事件拥有者的某个行为的对象。
  • 事件处理方法:事件触发后要执行的方法。当事件订阅者“发现”事件拥有者的事件被触发时,事件订阅者需要去执行的方法。一般来说,事件处理方法是定义在事件订阅者中。

以刚才的例子继续:狗叫是事件,那么狗是事件拥有者,主人是事件订阅者,起来抓小偷是听到狗叫后的事件处理方法

  1. 事件是建立在对委托的语言支持之上的,用于定义事件以及订阅或取消订阅事件的语法是对委托语法的扩展。

因为事件常用定义是用关键字event修饰的委托,事件的处理方法就是委托对象需要赋值的内容。事件的订阅就是将事件的处理方法赋值给事件的过程。

源代码分析

/*
代码实现:主人发出吃饭的信号,三只狗收到信号并作出反应,因此这是一个多播委托(有多个事件的订阅者)
*/
public class DogEvent : EventArgs //事件参数,和理解无关
{
    public string message { get; set; }
    public DogEvent(string s)
    {
        message = s;
    }
}
public class Host3
{
    public event EventHandler<DogEvent> Feed;//此处定义了一个事件,Host3拥有事件
    //public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e),从签名可以看出EventHandler就是预定义的委托。
    public void PrepareFeed()
    {
        Console.WriteLine("我是主人,准备好狗粮了!狗狗们快来!");
        OnFeed(new DogEvent("来了"));
    }
    protected virtual void OnFeed(DogEvent e)
    {
        EventHandler<DogEvent> handler = Feed;
        if(handler != null)//事件未被订阅
        {
            e.message += String.Format(" 现在是 {0}", DateTime.Now.ToString());

            handler(this, e);//此处事件发生
        }
        /*方便理解的话,可以不定义这个handler,直接将handler换成Feed
        if(Feed != null)
        {
            e.message += String.Format(" 现在是 {0}", DateTime.Now.ToString());

            Feed(this, e);//此处事件发生
        }
        */
    }
}
public class Dog3
{
    public string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    public Dog3(string name, Host3 MyHost)
    {
        this.name = name;
        MyHost.Feed += DogEventHandler;//订阅事件,订阅者是Dog3,事件处理程序是DogEventHandler
    }
    void DogEventHandler(object sender,DogEvent e)
    {
        Console.WriteLine("我是狗狗{0} {1}",name,e.message);
    }
}
class Program
{
	static void Main()
	{
		Host3 MySelf = new Host3();
	    Dog3 dg1 = new Dog3("小黄",MySelf);
	    Dog3 dg2 = new Dog3("小黑", MySelf);
	    Dog3 dg3 = new Dog3("小花", MySelf);
	    MySelf.PrepareFeed();//主人准备开饭了
	}
}

C# 事件

参考资料

  1. Microsoft Docs:https://docs.microsoft.com/zh-cn/dotnet/csharp/events-overview
  2. 这个很推荐七彩石头的博客:https://www.cnblogs.com/qcst123/p/11503730.html
相关标签: C# c#