对事件的理解——看张子阳的C# 中的委托和事件之后
这是我第一次在博客园里面发表文章,我来博客园主要是学习,在这里我学到了很多东西
感谢这的朋友们。在一个月里,我看了天轰穿的视频教程,这个入门很好,在这里我对川哥说声感谢,我不是打广告,主要是为了帮助更多想入门的朋友。
昨天看完了张子阳的c#中的事件这篇文章
地址http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html
看完之后,我觉得我基本理解了事件
这里我总结了这么几点,可能不太全面,希望大家指正,也希望能对入门的朋友做个参考
关于委托
1. 委托是c#中的一种类型。
2. 定义一个委托变量后,可以把方法赋值给委托,前提是这个方法必须要与委托有一致的签名。之后调用委托变量,就像调用方法,具有了该方法的功能。
3. 委托类型的变量,赋值后(注意赋值后)可以在绑定多个方法。调用委托变量,会依次调用绑定的方法。
4. 委托类型的变量可以用赋值方式,也可以用new的方式,说明委托是一种类型。
New的时候要注意的是,当定义的委托在某个类里面时,要在委托类型名前加上类名
格式是 委托类型 委托变量=new 类名.委托类型(方法)
在类外部是
格式是 委托类型 委托变量= new 委托类型(方法)
New的方式与赋值方法操作是同样的效果
关于事件的理解
1. 事件是类的成员
2. 事件实际上一个封装了的委托类型的变量,定义事件,就必须指定委托,或者定义一个委托。看了张子阳的文章,你可以知道,委托变量很矛盾,实现了封装,外部不能赋值。
实现了外部赋值,但违反了面向对象编程封装的原则。怎样达到这样两个效果,这就是需要事件的原因,事件对外部可以绑定方法,而不能赋值。实现了封装,但可以绑定。
解决委托变量无法完成任务。
3. 事件同样可以绑定多个方法,调用事件,会依次调用绑定的方法。
大家结合这个程序理解一下
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Event2 : System.Web.UI.Page
{
public class Heater
{
private int temperature;
public delegate void BoilHandler(int param);
public event BoilHandler BoilEvent;
public void BoilWater()
{
for (int i = 0; i <= 100; i++)
{
temperature = i ;
if (temperature > 95)
{
if (BoilEvent != null)
{
BoilEvent(temperature);//唤起事件,事件产生。
}
}
}
}
public void Test(int yy)
{
HttpContext.Current.Response.Write("要在方法内输出到页面上只能这么用HttpContext.Current.Response.Write(strScript)<br>"+yy .ToString ());
}
}
public class Alarm
{
public void MakeAlert(int param)
{
HttpContext.Current .Response .Write ( "Alarm :滴滴滴滴,水已经" + param.ToString() + "度了<br>");
}
}
public class Display
{
public static void ShowMsg(int param)
{
HttpContext.Current .Response .Write ( "Display:水快烧开了,当前温度为" + param.ToString() + "度了<br>");
}
}
protected void Page_Load(object sender, EventArgs e)
{
Heater heater = new Heater();
Alarm alarm = new Alarm();
heater.BoilEvent += heater.Test;
heater.BoilEvent += alarm.MakeAlert;//注册方法
heater.BoilEvent += (new Alarm()).MakeAlert;//给匿名对象注册
heater.BoilEvent += Display.ShowMsg;
heater .BoilWater ();//调用方法
}
}
初学者的理解,望大家指正