博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大白话系列之C#委托与事件讲解(二)
阅读量:6247 次
发布时间:2019-06-22

本文共 1917 字,大约阅读时间需要 6 分钟。

什么是事件?EVENT?点击事件?加载事件?一连串的模糊的概念冲击着我们弱小的脑袋

那我们首先来看一下比较正统的感念吧:

事件是类在发生其关注的事情时用来提供通知的一种方式。

事件的发生一般都牵扯2个角色

事件发行者(Publisher):一个事件的发行者,也称作是发送者(sender),其实就是个对象,这个对象会自行维护本身的状态信息,当本身状态信息变动时,便触发一个事件,并通知说有的事件订阅者。

事件订阅者(Subscriber):对事件感兴趣的对象,也称为Receiver,可以注册感兴趣的事件,在事件发行者触发一个事件后,会自动执行这段代码。

为了更好的让大家理解上面的概念,我先什么都不讲,我们先来看一段简单的代码:

 

 

代码
    
//
发布者(Publiser)
    
public
 
class
 Publisher
    {
        
//
声明一个出版的委托
        
public
 
delegate
 
void
 PublishEventHander();
        
//
在委托的机制下我们建立以个出版事件
        
public
 
event
 PublishEventHander OnPublish;
        
//
事件必须要在方法里去触发,出版社发布新书方法
        
public
 
void
 issue()
        {
            
//
如果有人注册了这个事件,也就是这个事件不是空
            
if
 (OnPublish 
!=
 
null
)
            {
                Console.WriteLine(
"
最新一期的《火影忍者》今天出版哦!
"
);
                OnPublish();
            }
        }
    }
    
//
Subscriber 订阅者,无赖小明
    
public
 
class
 MrMing
    {
        
//
对事件感兴趣的事情,这里指对出版社的书感兴趣
        
public
 
static
 
void
 Receive()
        {
            Console.WriteLine(
"
嘎嘎,我已经收到最新一期的《火影忍者》啦!!
"
);       
        }
    }
    
    //Subscriber 订阅者,悲情人物小张
    
public
 
class
 MrZhang
    {
        
//
对事件感兴趣的事情
        
public
 
static
 
void
 Receive()
        {
            Console.WriteLine(
"
幼稚,这么大了,还看《火影忍者》,SB小明!
"
);
        }
    }
    
class
 Story
    {
        
public
 
static
 
void
 Main(
string
[] args)
        {
            
//
实例化一个出版社
            Publisher publisher 
=
 
new
 Publisher();
            
//
给这个出火影忍者的事件注册感兴趣的订阅者,此例中是小明
            publisher.OnPublish 
+=
 
new
 Publisher.PublishEventHander(MrMing.Receive);
            
//
另一种事件注册方式
            
//
publisher.OnPublish += MrMing.Receive;
            
//
发布者在这里触发出版火影忍者的事件
            publisher.issue();
            Console.ReadKey();
        }
    }
 

编译结果如下

 

 

如果童靴们,从上到下仔细看一边的话,我想应该知道什么是发布者,什么是订阅者了吧,那至于事件呢

我们先看这句

publisher.OnPublish += new Publisher.PublishEventHander(MrMing.Receive);

这就是小明向出版社订阅他喜欢看的火影忍者,小张没有订阅所以小张没有收到书,

 

我们再仔细看看这个赋值语句,是不是似曾相识过呢?是的就是我们在上一讲,在讲委托声明的时候,简直就是一个眸子里刻出来的嘛

委托赋值:

BugTicketEventHandler myDelegate = new BugTicketEventHandler(MrZhang.BuyTicket);

所以,大家不要对事件有什么好怕的,其实事件的本质就是一个委托链,

我们看一下事件的声明:

        //声明一个出版的委托

        public delegate void PublishEventHander();
        
//在委托的机制下我们建立以个出版事件
        public event PublishEventHander OnPublish;
在我们使用事件的时候,必须要声明对应的委托,而触发事件,其实就是在使用委托链。

好了大家先消化消化这讲的内容,我们在下一讲里,我们会讲到我们期盼已久的Sender,e两个神秘的参数了

转载于:https://www.cnblogs.com/ywsoftware/archive/2013/05/20/3088213.html

你可能感兴趣的文章
关于如何给for循环遍历出来的每一项注册事件并且在注册的事件里面打印出对应的下标...
查看>>
[小程序] mpVue 踩坑
查看>>
【其他】为公司项目个性化 Git 设置
查看>>
Android加快编译速度的另一种方法
查看>>
常见的Node.js攻击-恶意模块的危害
查看>>
Netty从没听过到入门 -- 服务器端详解(什么是netty?netty的应用场景是什么?netty的简易使用)...
查看>>
不要使用SBJSON(json framework)
查看>>
2019-05-15T02:28:01.000+0000
查看>>
记录数组常用方法汇总
查看>>
MJRefresh-Swift版本--JRefresh
查看>>
设计模式——责任链模式
查看>>
18.Vue.nextTick实现
查看>>
通过ART 提高Android App 性能
查看>>
iOS开发中高级进阶书籍资源汇总(你想要了解的这里都有)
查看>>
记一次gitHook带来的思考
查看>>
案例剖析 | 某大型央企保险资产管理机构的数字化进阶之路
查看>>
windows开发环境配置
查看>>
设计模式——单例模式
查看>>
JS异步的几种写法
查看>>
nodejs: mac上阿里云部署
查看>>