为什么要使用事件呢?举个简单的例子,比如说你的界面上有个bottom按钮,然后你写了一个点击一下这个按钮就弹出一个消息窗口的代码,然而你要弹出消息窗口的这个事,开发控件的人并不知道,所以开发者预先定义好了这个事件,他并不关心你点击这个按钮要干什么,但是按钮却通过点击事件调用了你的代码。
其实事件说简单点:就像委托一样,只是他多了一个约束,这个约束就是当XXX达到了某个时刻(某个点),然后就触发了XXX事情;
还不理解,没关系,看个小例子;大家平时都喜欢关注微博吧,就拿这个做个例子吧,可能不是很好,凑合着看看吧;
粉丝(Fans)关注了大V(bigV),相当于订阅了一个事件
大V发了一条微博,相当于产生了一个事件
在这个事件中Fans收到了大V的微博,下面是具体代码
这是微博的内容,即事件的一个参数
public class MicroBlogEventArgs : EventArgs
{
private DateTime sendDateTime;
public DateTime SendDateTime { get { return this.sendDateTime; } }
private string author;
public string Author { get { return this.author; } }
private string context;
public string Context { get { return this.context; } }
public MicroBlogEventArgs(DateTime createDateTime, string author, string context)
{
this.sendDateTime = createDateTime;
this.author = author;
this.context = context;
}
}
这是大V对象,大V定义了事件
public class BigV
{
private string name;
public BigV(string name) {
this.name = name;
}
public event EventHandler<MicroBlogEventArgs> SendMicroBlog;
/// <summary>
/// 由大V产生一个事件(即大V发了一条微博)
/// </summary>
/// <param name="e"></param>
public void OnSendMicroBlog(MicroBlogEventArgs e) {
System.Threading.Interlocked.CompareExchange(ref SendMicroBlog, null, null);
if (SendMicroBlog!=null)
{
SendMicroBlog(this, e);
}
}
public void SimulateSendMicroBlog(DateTime dt,string context) {
MicroBlogEventArgs e = new MicroBlogEventArgs(dt, this.name, context);
OnSendMicroBlog(e);
}
}
下面这个就是Fans了,fans只要关注(订阅)大V,就可以看到大V的微博了
public class Fans
{
public Fans( BigV bigV)
{
bigV.SendMicroBlog += new EventHandler<MicroBlogEventArgs>(bigV_SendMicroBlog);
}
void bigV_SendMicroBlog(object sender, MicroBlogEventArgs e)
{
Console.WriteLine("{0},{1}发了:{2}", e.SendDateTime, e.Author, e.Context);
}
}
下面就是模拟,大V发微博,然后关注他的fans就能收到他的微博了
class Program
{
static void Main(string[] args)
{
BigV bigV = new BigV("zhangsan");
Fans fans = new Fans(bigV);
bigV.SimulateSendMicroBlog(DateTime.Now, "NO ZUO NO DIE");
Console.ReadKey();
}
}
其实大家都知道事件是怎么一回事,只是拿代码来表示的时候就感觉怎么也写不出来,所以大家不妨在网上多找几个例子练练,今天就到此吧
原文地址:http://my.oschina.net/u/726981/blog/290702