C#.NET -- 自定义事件
最近研究了一下C#.NET的委托与事件这些东西,通过园子多篇文章的学习,基本上有了一个了解,现将一些基本的事件研究代码贴出来,分享一下,也希望大家能够多多指点。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class BaseOnEvent : System.Web.UI.Page
{
/*
*事件:事件的本质就是一个委托链,在我们使用事件的时候,必须要声明对应的委托,而触发事件,其实就是在使用委托链。
*在执行某个事件时,先要看看有没有人订阅这个事件,没有人订阅的话,那就不用执行了(此时事件为null,执行会报错)。
*/
//申明一个委托
public delegate void Publish(int state);
//申明一个事件
public event Publish OnPublish;
protected void Page_Load(object sender, EventArgs e)
{
//首先需要知道有哪些对象关注这个事件,以下是设置关注者列表,默认Eson与Aliy都对此事件比较关注
OnPublish += MrEson.GetLatestNews;
OnPublish += MissAliy.GetLatestNews;
//记住:事件必须要在方法中触发
Test();
}
private void Test()
{
//首先处理该方法的一些逻辑
Response.Write("系统消息:hello,wrold!今天起,博客园正式开通啦!<br />");//发生第一个事件
//注意此处:事件分发是在该事件被订阅、被关注时,才被执行,如果该事件没有任何对象来关注,则不需要广播
//当然了,也可以在处理逻辑的中途广播给每个订阅者,以让每个关注者知道具体处理的进度或者状态等等
if (OnPublish != null)
OnPublish(0);
//紧接着事件发生了一些变化,需要将这些发生的变化通知到每个关注者那里去
Response.Write("<br /><br />系统消息:恭喜恭喜,博客园又出新功能了!<br />");
if (OnPublish != null)
OnPublish(1);
//又发生了新的变化,同样把变化的内容通知关注者
Response.Write("<br /><br />系统消息:从今日起,注册成为博客园会员,将会免费获得香港一日游的机会。<br />");
if (OnPublish != null)
OnPublish(2);
Response.Write("<br /><br />系统消息:还有哪些用户在关注本次事件的,吃饭去了。。。<br />");
OnPublish -= MissAliy.GetLatestNews;//在此取消订阅
if (OnPublish != null)
OnPublish(1);
}
}
public class MrEson
{
//由于Eson对技术比较感兴趣,所以他对博客园的消息一直都在关注
public static void GetLatestNews(int state)
{
if (state == 0)
HttpContext.Current.Response.Write("知道了,博客园开通了。<br />");
else if (state==1)
HttpContext.Current.Response.Write("哦,博客园又出新功能了,还可以在线聊天。<br />");
else if (state==2)
HttpContext.Current.Response.Write("恩,博客园真是越来越好了,哈哈..<br />");
}
}
public class MissAliy
{
//Aliy就不一样了,他只关注那些大的新闻,小的新闻就直接不理
public static void GetLatestNews(int state)
{
if (state == 0)
HttpContext.Current.Response.Write("我是Miss Aliy,呵呵,我的网站也马上上线了。<br />");
else if (state == 1)
HttpContext.Current.Response.Write("恩,博客园还是挺不错的,不过跟我比起来还有点距离。<br />");
else if (state == 2)
{
//new BaseOnEvent().OnPublish -= MissAliy.GetLatestNews;
//不能在这里取消订阅,要取消订阅只有在发生事件的方法体内取消,本次取消无效
HttpContext.Current.Response.Write("哎,没意思,我还是写我的代码吧....<br />");
}
}
}
推荐几篇写的比较好的文章,也是有关委托与事件的:
http://www.cnblogs.com/wudiwushen/archive/2010/04/20/1698795.html,系列篇,通俗易懂。
http://www.cnblogs.com/markhe/archive/2009/08/26/1554710.html,这个是一个委托作为返回值和参数做的计算器。