您的位置:首页 > 编程语言 > C#

C# 事件的简单理解

2016-03-30 15:30 387 查看
引用书中的一段话:

事件基于委托。为委托提供了一种发布订阅机制.

从这句话来看,首先要有委托,然后有事件,发布事件,接着订阅事件.

第一部分:最简单的例子

看第一个例子:

class Program
{
static void Main(string[] args)
{
Event1 e1 = new Event1();
e1.EventHandle += e1.SayEvent2; //订阅了消息
e1.SayEvent1();
Console.ReadKey();
}
}
public delegate void MyEventHandle(object sender,System.EventArgs e);//(1)定义委托
public class Event1
{
public event MyEventHandle EventHandle;//(2)定义事件
public void SayEvent2(object sender,System.EventArgs e)  (3)事件体
{
if (EventHandle != null)
{
Console.WriteLine("我需要触发!");
}
}
public void SayEvent1() //触发SayEvent2
{
Console.WriteLine("我不需要触发!");
EventHandle(this,new EventArgs());
}
}


这里需要注意的有:

1:定义delegate对象时要有两个参数object senderSystem.EventArgs e

2:定义事件时,事件类型要跟委托类型相同

3:事件体中事件处理方法要跟delegate对象有相同的参数和返回值

4:事件触发的方式是 事件名(参数1,参数2)

5:订阅消息时用+=,取消的时候用 -=

第二部分:对于上一个例子,订阅消息是在调用的时候添加到队列的,也可以在构造函数中进行添加。

如:

class Program
{
static void Main(string[] args)
{
Event1 e1 = new Event1();
//e1.EventHandle += e1.SayEvent2;
e1.SayEvent1();
Console.ReadKey();
}
}
public delegate void MyEventHandle(object sender,System.EventArgs e);
public class Event1
{
public Event1()//我是构造函数,添加事件到队列中
{
this.EventHandle += new MyEventHandle(SayEvent2);
}
public event MyEventHandle EventHandle;
public void SayEvent2(object sender,System.EventArgs e)
{
if (EventHandle != null)
{
Console.WriteLine("我需要触发!");
}
}
public void SayEvent1()
{
Console.WriteLine("我不需要触发!");
EventHandle(this,new EventArgs());
}
}


第三部分:delegate的第二个参数,可以自己定义

class Program
{
static void Main(string[] args)
{
Event1 e1 = new Event1();
//e1.EventHandle += e1.SayEvent2;
e1.SayEvent1("jazz");
Console.ReadKey();
}
}
public class myEvent : EventArgs
{
public string _name;
public myEvent(string name)
{
this._name = name;
}
}
public delegate void MyEventHandle(object sender, myEvent e);
public class Event1
{
public Event1()
{
this.EventHandle += new MyEventHandle(SayEvent2);
}
public event MyEventHandle EventHandle;
public void SayEvent2(object sender, myEvent e)
{
if (EventHandle != null)
{
Console.WriteLine("我需要触发!");
}
}
public void SayEvent1(string name)
{
Console.WriteLine("我不需要触发!");
EventHandle(this, new myEvent(name));
}
}


这里要注意:

定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。

第四部分:两个类中

class Program
{
static void Main(string[] args)
{
Event1 e1 = new Event1();
Event2 e2 = new Event2();
//e1.EventHandle += e1.SayEvent2;
e1.EventHandle += e2.SayEvent3; //添加事件到消息队列
e1.SayEvent1("jazz");
Console.ReadKey();
}
}
public class myEvent : EventArgs
{
public string _name;
public myEvent(string name)
{
this._name = name;
}
}
public delegate void MyEventHandle(object sender, myEvent e);
public class Event1
{
public Event1()
{
this.EventHandle += new MyEventHandle(SayEvent2);
}
public event MyEventHandle EventHandle;
public void SayEvent2(object sender, myEvent e)
{
if (EventHandle != null)
{
Console.WriteLine("我需要触发!");
}
}
public void SayEvent1(string name)
{
Console.WriteLine("我不需要触发!");
EventHandle(this, new myEvent(name));
}
}
public class Event2
{
public void SayEvent3(object sender, myEvent e)
{
Console.WriteLine("我需要触123456!");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: