c#之事件委托
2016-03-26 18:09
330 查看
在写这篇文章之前,先抛出两个想的不太清楚的问题,问题:为什么需要事件委托?什么时候需要定义事件委托?
(1)声明事件委托
public delegate void EventHandler(Object sender,Eventargs e);
事件会指向一个或多个函数,指向的函数要与事件所基于的委托的参数匹配
函数命名规则:Object-event命名约定
Object :引发事件的对象
event:被引发的事件
第一个参数接收引发事件的对象,比如当单机某个按钮,这个按钮要触发的事件最终执行这个函数,就会把当前按钮传给sender,当有多个按钮单击的事件都指向这个函数的时候,sender的值就取决于当前被单击的那个按钮。
(2)声明一个事件
public event EventHandler Changed;
(3)引发一个事件
public void Onchange(Eventargs e) //参数要与委托的参数匹配Eventargs
{
if(Changed!=null)
{
Changed.Invoke(this,e);
//Changed(this,e);
}
}
(4)定义事件处理程序
public void Mytext_doChange(Object sender,Eventargs e){}
(5)订阅事件
Changed+=EventHandler(MyText_doChange)
1)在定义事件的那个类A里面,可以任意的使用事件名,可以触发;在别的类里面,事件名只能出现在+= 或 -= 的左边来指向函数,即只能实例化,不能直接用事件名触发。但是可以通过A类的对象来调用A类中的触发事件的函数。这是唯一触发事件的方式。
2)不管是多播委托还是单播委托,在没有特殊处理的情况下,在一个线程的执行过程中去调用委托(委托对象所指向的函数),调用委托的执行是不会新起线程的,这个执行还是在原线程中的,这个对于事件也是一样的。当然,如果是在委托所指向的函数里面去启动一个新的线程那就是另外一回事了。
3) 事件是针对某一个具体的对象的,一般在该对象的所属类A中写好事件,并且写好触发事件的方法,那么这个类A就是事件的发布者,然后在别的类B里面定义A的对象,并去初始化该对象的事件,让事件指向B类中的某一个具体的方法,B类就是A类事件的订阅者。当通过A类的对象来触发A类的事件的时候(只能A类的对象来触发A类的事件,别的类的对象不能触发A类的事件,只能订阅A类的事件,即实例化A类的事件),作为订阅者的B类会接收A类触发的事件,从而使得订阅函数被执行。一个发布者可以有多个订阅者,当发布者发送事件的时候,所有的订阅者都将接收到事件,从而执行订阅函数,但是即使是有多个订阅者也是单线程。
(1)声明事件委托
public delegate void EventHandler(Object sender,Eventargs e);
事件会指向一个或多个函数,指向的函数要与事件所基于的委托的参数匹配
函数命名规则:Object-event命名约定
Object :引发事件的对象
event:被引发的事件
第一个参数接收引发事件的对象,比如当单机某个按钮,这个按钮要触发的事件最终执行这个函数,就会把当前按钮传给sender,当有多个按钮单击的事件都指向这个函数的时候,sender的值就取决于当前被单击的那个按钮。
(2)声明一个事件
public event EventHandler Changed;
(3)引发一个事件
public void Onchange(Eventargs e) //参数要与委托的参数匹配Eventargs
{
if(Changed!=null)
{
Changed.Invoke(this,e);
//Changed(this,e);
}
}
(4)定义事件处理程序
public void Mytext_doChange(Object sender,Eventargs e){}
(5)订阅事件
Changed+=EventHandler(MyText_doChange)
class TestEvent{
<span style="margin: 0px; padding: 0px; border: none; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;"> private string str=""; </span>
public delegate void EventHandler(Object sender,Eventargs e);
public event EventHandler Changed;
<p> public void Onchange(Eventargs e) //参数要与委托的参数匹配Eventargs</p><p>{</p><p> if(Changed!=null)</p><p> {</p><p> Changed.Invoke(this,e);</p><p> //Changed(this,e);</p><p> }</p><p> public string Text</p><p>{</p><p> get{return this.str;} </p><p> set{this.str=value;</p><p> //触发事件</p><p> this.Onchange(new EventARgs)</p><p>}</p><p> </p><p>}</p><p> }</p>
}
class Test
{
TestEvent te = new TestEvent();
te.Changed+=new te.EventHandler(Test_doChanged);
string str="";
while(str!="quit")
{
str = Console.Readline();
te.Text = str;
}
//对change事件进行处理的程序
public void Test_doChange(Object sender,Eventargs e)
{
<span> </span>Consloe.Writeline("text has been changed: {0}\n",(te)sender.Text);
}
}
1)在定义事件的那个类A里面,可以任意的使用事件名,可以触发;在别的类里面,事件名只能出现在+= 或 -= 的左边来指向函数,即只能实例化,不能直接用事件名触发。但是可以通过A类的对象来调用A类中的触发事件的函数。这是唯一触发事件的方式。
2)不管是多播委托还是单播委托,在没有特殊处理的情况下,在一个线程的执行过程中去调用委托(委托对象所指向的函数),调用委托的执行是不会新起线程的,这个执行还是在原线程中的,这个对于事件也是一样的。当然,如果是在委托所指向的函数里面去启动一个新的线程那就是另外一回事了。
3) 事件是针对某一个具体的对象的,一般在该对象的所属类A中写好事件,并且写好触发事件的方法,那么这个类A就是事件的发布者,然后在别的类B里面定义A的对象,并去初始化该对象的事件,让事件指向B类中的某一个具体的方法,B类就是A类事件的订阅者。当通过A类的对象来触发A类的事件的时候(只能A类的对象来触发A类的事件,别的类的对象不能触发A类的事件,只能订阅A类的事件,即实例化A类的事件),作为订阅者的B类会接收A类触发的事件,从而使得订阅函数被执行。一个发布者可以有多个订阅者,当发布者发送事件的时候,所有的订阅者都将接收到事件,从而执行订阅函数,但是即使是有多个订阅者也是单线程。
相关文章推荐
- 关于C#中的弱引用
- C# 随机数组游戏
- C#序列化,反序列化(Serialize,Deserialize)
- C#获取当前路径的7种方法
- c#---List共享空间的情况
- 网速监控 v1.6.1(C#,源代码)
- 学习笔记整理之C#
- C#第三次上机
- C# 三种字节数组(byte[])拼接的性能对比测试
- C#简单实现在网页上发邮件的案例
- C#简单判断文件的编码格式
- C# 图片处理心得
- [C#]第30位数字是多少
- C#第二次上机
- C#第一次上机
- C#中的OLEDB连接2
- C#制作视频播放器-player播放器组件
- C# 编写WCF简单的服务端与客户端
- c#单例模式3中写法
- C#扫盲之:String字符串的常用方法和冷知识