您的位置:首页 > 编程语言 > C#

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 ;

我们直接把事件成员当作公共成员进行公开,这样做是不好的。我们可以定义两个方法分别用于执行客户对事件的订阅与取消,这里就不写了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: