C#中的事件定义与处理

来源:互联网 发布:淘宝宝贝评价多久清空 编辑:程序博客网 时间:2024/05/19 00:15

这是一个膝上型电脑使用电池的例子。电池类提提供两个事件,分别用于在电量耗尽和电量低于某一界限时引发。

一、事件的定义

首先是关于一个类的事件成员的定义,虽然.net中的事件基于委托,但在定义时还是有需要说明的地方。要为一个类定义一个事件,可以分为两个步骤。

1、定义事件要使用的委托

public delegate void LowChargeEventHandler(object sender,LowChargeEventArgs e) ;

这里,LowChargeEventHandler委托有两个参数,这是固定的,sender代表事件源,e代表事件参数(可供事件处理程序使用)

2、定义事件

public event LowChargeEventHandler LowCharge ;

这里使用了event关键字来为一个类提供事件的定义,其中,LowCharge为事件名称,LowChargeEventHandler 是一个委托类型。

二、关于EventHandle与EventArgs

EventHandle事件是.net内置的,它通常与EventArgs(所有事件数据类的基类)一块使用。如果一个事件不承载任何事件数据(即不向事件处理程序提供任何事件参数)时,我们就可以使用EventHandler与EventArgs,但是如果你的事件需要向事件处理程序提供必要的事件参数的话,那就需要定义新的委托与事件数据了。

三、示例

1、LowChargeEventArgs.cs(该文件定义了一个事件数据类,以为事件处理程序提供事件数据)

public class LowChargeEventArgs:EventArgs
{
     private double _level ;

     public LowChargeEventArgs()
     {
      //
      // TODO: 在此处添加构造函数逻辑
      //
     }

     public LowChargeEventArgs(double batteryLevel)
     {
      _level = batteryLevel ;
     }

     public double Level
     {
      get
      {
       return _level ;
      }
     }
}

2、LowChargeEventHandler.cs(该文件定义了一个新的事件委托)

public delegate void LowChargeEventHandler(object sender,LowChargeEventArgs e) ;

3、Battery.cs(这是关键,包含了事件的定义与引发)

public class Battery
{
     //当电量降低到0.05(或以下)时表示电量耗尽
     private const double DepletedLevel = 0.05 ;

     //当前电量
     private double _currentLevel ;

     //允许使用的最小电量纸别(低于该级别,程序会引发事件并提示用户,但用户可以正常工作)
     private double _mininumLevel ;

     //低电量所要引发的事件
     public event LowChargeEventHandler LowCharge ;

     //电量耗尽时所要引发的事件
     public event EventHandler Depleted ;

     public Battery():this(1.0 , 0.15)
     {
      //...
     }

     //新的构造函数
     public Battery(double currentLevel , double mininumLevel)
     {
      _currentLevel = currentLevel ;

      _mininumLevel = mininumLevel ;
     }

     /// <summary>
     /// 该属性表示当前电量级别
     /// </summary>
     public double CurrentLevel
     {
      get
      {
       return _currentLevel ;
      }
      set
      {
       if ( value < 0.0 || value > 1.0 )
       {
        throw new ArgumentOutOfRangeException("value" , value , "CurrentLevel must be between 0.0 and 1.0 " ) ;
       }

       _currentLevel = value ;

       if ( _currentLevel > DepletedLevel && _currentLevel < _mininumLevel )//处于低电量状态
       {
        LowChargeEventArgs e = new LowChargeEventArgs( _currentLevel ) ;

        OnLowCharge( e ) ;//引发电量低的事件
       }
       else if ( _currentLevel > 0.0 && _currentLevel <= DepletedLevel )//处于电量耗尽状态
       {
        LowChargeEventArgs e = new LowChargeEventArgs( _currentLevel ) ;

        OnDepleted( e ) ;//引发电量耗尽的事件
       }
      }
     }

     /// <summary>
     /// 该属性表示允许使用的最小电量
     /// </summary>
     public double MininumLevel
     {
      get
      {
       return _mininumLevel ;
      }
      set
      {
       if ( value <= DepletedLevel || value > 0.5 )
       {
        throw new ArgumentOutOfRangeException("value" , value , string .Format("MininumLevel must be greater than {0:f2} and less than 0.5" , DepletedLevel ) ) ;
       }
       else
       {
        _mininumLevel = value ;
       }
      }
     }

     /// <summary>
     /// 当前电量小于允许的最小电量时的事件处理程序
     /// </summary>
     /// <param name="e"></param>
     public virtual void OnLowCharge( LowChargeEventArgs e )
     {
      if ( LowCharge != null )
      {
       LowCharge( this , e ) ;
      }

     }

     /// <summary>
     /// 电量耗尽时的事件处理程序
     /// </summary>
     /// <param name="e"></param>
     public virtual void OnDepleted( LowChargeEventArgs e )
     {
      if ( Depleted != null )
      {
       Depleted( this ,e ) ;
      }
     }
}

4、LapTop.cs(膝上型电脑类,它使用了电池类Battery)

public class LapTop
{
     private Battery _battery ;

     public LapTop()
     {
      _battery = new Battery() ;

      _battery.LowCharge += new LowChargeEventHandler( this._battery_LowCharge ) ;

      _battery.Depleted += new EventHandler(_battery_Depleted);
     }

     private void _battery_LowCharge(object sender , LowChargeEventArgs e )
     {
      Console.WriteLine( "Battery is low , {0:f1} percent charged" , e.Level * 100.0 ) ;

      Console.WriteLine( "Save your work !" ) ;
     }

     private void _battery_Depleted(object sender,EventArgs e )
     {
      Console.WriteLine( "Battery is out of juice!" ) ;

      Console.WriteLine( "Power down in 30 seconds..." ) ;
     }

     public void start()
     {
      do
      {
       double NewLevel = _battery.CurrentLevel - 0.05 ;

       if ( NewLevel < 0.0 )
       {
        _battery.CurrentLevel = 0.0 ;
       }
       else
       {
        _battery.CurrentLevel = NewLevel ;

        Thread.Sleep( 50 ) ;
       }
      }
      while(_battery.CurrentLevel > 0.0 );
     }

}

5、Main.cs(Main程序)

class MyEvent
{
     [STAThread]
     static void Main(string[] args)
     {
      LapTop myLapTop = new LapTop() ;

      myLapTop.start() ;

      Console.WriteLine( "Press enter to exit..." ) ;

      Console.ReadLine() ;
     }
}

请注意在Battery类中的定义

     //低电量所要引发的事件
     public event LowChargeEventHandler LowCharge ;

     //电量耗尽时所要引发的事件
     public event EventHandler Depleted ;

我们直接把事件成员当作公共成员进行公开,这样做是不好的。我们可以定义两个方法分别用于执行客户对事件的订阅与取消,这里就不写了。


 
原创粉丝点击