C#中的事件定义与处理
2007-05-22 09:49
471 查看
这是一个膝上型电脑使用电池的例子。电池类提提供两个事件,分别用于在电量耗尽和电量低于某一界限时引发。
一、事件的定义
首先是关于一个类的事件成员的定义,虽然.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 ;
我们直接把事件成员当作公共成员进行公开,这样做是不好的。我们可以定义两个方法分别用于执行客户对事件的订阅与取消,这里就不写了。
一、事件的定义
首先是关于一个类的事件成员的定义,虽然.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 ;
我们直接把事件成员当作公共成员进行公开,这样做是不好的。我们可以定义两个方法分别用于执行客户对事件的订阅与取消,这里就不写了。
相关文章推荐
- 【转】C#中的预定义事件处理机制
- C#中的预定义事件处理机制
- C#学习:事件处理与定义事件
- C#动态组件添加以及预定义事件处理
- C#中的预定义事件处理机制(转)
- 了解C#中的预定义事件处理机制【整理】
- C#处理鼠标和键盘事件
- 深入分析C#中处理和键盘相关事件的详解
- 在C#事件处理中灵活应用泛型
- C#中如何处理鼠标事件
- 浅析C#的事件处理和自定义(转)
- C#中定义一个事件和对其的调用
- 浅析C#的事件处理和自定义事件_C#教程
- 浅析C#的事件处理和自定义事件_C#教程
- 关于C#事件处理函数中的参数(object sender, EventArgs e)
- Flex、Java、C#、JavaFX的事件处理机制的比较
- c#中serialPort1_DataReceived串口接收事件处理
- c# 事件处理机制
- c#消息队列,事件处理(java)
- 浅析C#的事件处理和自定义事件[object sender , EventArgs e]