C# 在类中定义事件

来源:互联网 发布:linux网络排查 编辑:程序博客网 时间:2024/05/19 02:03

事件说明

事件一定要有发出者和事件的响应者。同时事件有一定的入口参数和返回值。事件的一系列过程由委托(delegate)来完成,委托相当于函数指针,它将事件响应函数的函数指针与类的事件字段绑定一起,用来告诉事件发出者事件发出后事件的响应函数的起始位置。事件的发出者就找到了响应函数的起始位置就可以完成事件的响应了。

事件的发出者:事件字段

产生事件:由事件字段在特定的时候发出事件

事件的响应:响应函数,由委托传递响应函数的函数指针。

代码步骤

步骤①定义一个事件的委托

public delegate void SupportedProtocolClientEventHandler(AgentClient agent, string protocol);

其中:

SupportedProtocolClientEventHandler 是委托的名字,我们约定委托的名字以EventHandler结尾。

void 是委托事件的返回值类型,他规定了事件的返回值。

(AgentClient agent, string protocol) 是形参列表,他规定了事件的参数列表。

可以看出委托的定义就规定了这个事件的形参和返回值类型,即规定了一个事件类型。

注意:委托的定义一般应该定义在类体的外面,名称空间的里面。因为委托的类型是Class。当然你也可以把委托的定义放在类的内部,此时这个委托相当于类的内部类。

步骤②在类的内部创建一个事件字段

public event SupportedProtocolClientEventHandler SupportedProtocolEvent;

其中:

event 是标志了在类中定义的对象是事件字段。

SupportedProtocolClientEventHandler 是之前定义的委托,它规定了这个事件字段的事件类型,即规定了事件的形参和返回值。

SupportedProtocolEvent 是事件字段的名字,由他来发出事件。我们约定以Event结尾,因为这样便于识别这个字段是个事件字段。

注意:这里我们是用字段对外公开事件的,所以要用public关键字修饰,不然调用者无法响应该事件。

当然,你也可以将事件字段封装成属性,此时你的代码可以这样写

       private SupportedProtocolClientEventHandler SupportedProtocolEvent;       public event SupportedProtocolClientEventHandler OnSupportedProtocol       {            add { SupportedProtocolEvent += value; }            remove { SupportedProtocolEvent -= value; }       }

这样做,就将事件封装成了一个属性。对外公开的则是SupportedProtocol不再是SupportedProtocolEvent。这里OnSupportedProtocol属性提供了一个add和一个remove用来为SupportedProtocolEvent事件字段完成绑定事件和解除绑定事件。而value是属性包装器的内置参数,此时value的类型是函数指针。

步骤③发出事件

在类的某个函数中(执行的代码中)你可能需要发出这个类型的事件,也即当你在需要发出该事件时你只需要使用:

    事件字段.Invoke(实参列表)

    事件字段(实参列表)

来发出事件。即

SupportedProtocolEvent.Invoke(this, protocol);

SupportedProtocolEvent(this, protocol);

    但是为了安全起见,你应当在发出事件前判断事件字段是否为null。于是安全的代码应当这样写:

    if(SupportedProtocolEvent != null)                SupportedProtocolEvent.Invoke(this, protocol);

至此,在类中定义事件和发出事件的工作做完了,接下来就是在其他类中是用这个类并将这个类的事件绑定事件的响应代码(或者取消事件的响应)

步骤④绑定和解绑事件

这个过程很简单,就是调用这个类并用+=和-=来为事件绑定响应和解除响应。

绑定事件响应:

            对象.事件字段+=函数名;

            对象.事件属性+=函数名;

具体的举例:

步骤⑤事件响应函数

    略

代码举例

等待后期编辑
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 租了公租房辞职怎么办 申请公租房收入明细没有怎么办 杭州公租房满3年怎么办 小学寄读不转学籍手续怎么办 炸东西的油糊了怎么办 赠送面积为违建怎么办 执法不管违建我怎么办 司法考试毕业院校写错了怎么办 家具店西安一直拖着不交货怎么办 派出所私自迁移了我家户口怎么办? 退房子不退押金怎么办 租房子中介不退押金怎么办 租房子押金不退怎么办 外地人签户口到武汉怎么办 开发商不给办土地证怎么办 房间里的油烟味怎么办 现金借款app还不了款怎么办 学校不允许实习生自己租房怎么办 盯盯拍开不了机怎么办 向私人借钱不还怎么办 微信好友借钱不还怎么办 支付宝借不了钱怎么办 支付宝借条关了怎么办 qq群不小心解散了怎么办 qq群解散了照片怎么办 出租屋没窗户很闷怎么办 二手房交税后房主不卖怎么办 二房东收不到租拖欠房租怎么办 房东不给换门锁怎么办 租房到期房东联系不到租客怎么办 廉租房名下有车怎么办 路边停车收忘记交费怎么办 考编忘记交费了怎么办 深圳公租房入库了接下来怎么办 公租房5年以后怎么办 教务系统密码忘记了怎么办 林科大教务处密码忘记了怎么办 智学号密码忘了怎么办 正方教务管理系统忘记密码怎么办 正方教务系统忘记密码怎么办 教务网密码忘了怎么办