对事件的理解——看张子阳的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;
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 ();
//调用方法

    }

}



初学者的理解,望大家指正

posted on 2007-10-17 21:43  马洋  阅读(2994)  评论(1编辑  收藏  举报

导航