C# 事件

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();//主人准备开饭了
	}
}

在这里插入图片描述

参考资料

  1. Microsoft Docs:https://docs.microsoft.com/zh-cn/dotnet/csharp/events-overview
  2. 这个很推荐七彩石头的博客:https://www.cnblogs.com/qcst123/p/11503730.html
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值