C#.Net 和 Mircosoft AJAX Library 定义事件
一、 C#.Net事件定义
在C#.Net中定义事件的方式最要有两种:第一种是每个事件定义一个代理;第二种使用EventHandlerList来管理事件。
1、在第一种方式中根据.Net FrameWork是否支持泛型,又有稍微的区别。这里console类型程序监听输入的字符,并将输入的首个字符大写打印出来为例。
定义部分:
代码
//键EventArgs参数
public class KeyEventArgs:EventArgs
{
private char _keyValue;
public KeyEventArgs(char keyValue)
{
this._keyValue = keyValue;
}
public char get_Key(){
return this._keyValue;
}
}
//字符监听类
public class keyCharMonitor{
//.net framework 1.0/1.1 的方法
public delegate void KeyEventHandler(object sender, KeyEventArgs eKey);
public event KeyEventHandler KeyDown;
////.net framework 2.0的方法,可以使用泛型
//public event EventHandler<KeyEventArgs> KeyDown;
//对外释放的事件,即外部可以通过该方法激发事件
public void OnKeyDown(KeyEventArgs eKey)
{
if (KeyDown != null)
{
KeyDown(this, eKey);
}
}
}
public class KeyEventArgs:EventArgs
{
private char _keyValue;
public KeyEventArgs(char keyValue)
{
this._keyValue = keyValue;
}
public char get_Key(){
return this._keyValue;
}
}
//字符监听类
public class keyCharMonitor{
//.net framework 1.0/1.1 的方法
public delegate void KeyEventHandler(object sender, KeyEventArgs eKey);
public event KeyEventHandler KeyDown;
////.net framework 2.0的方法,可以使用泛型
//public event EventHandler<KeyEventArgs> KeyDown;
//对外释放的事件,即外部可以通过该方法激发事件
public void OnKeyDown(KeyEventArgs eKey)
{
if (KeyDown != null)
{
KeyDown(this, eKey);
}
}
}
使用部分:
代码
public class User
{
public User()
{
//监听对象
keyCharMonitor keyMonitor = new keyCharMonitor();
//.net framework 1.0/1.1 的方法,绑定事件触发时的处理函数
keyMonitor.KeyDown += new keyCharMonitor.KeyEventHandler(keyReiever.Echo);
////.net framework 2.0的方法,可以使用泛型
////EventHandler<KeyEventArgs>包含在系统中
//keyMonitor.KeyDown += new EventHandler<KeyEventArgs>(keyReiever.Echo);
bool isFinished = false;
do
{
Console.WriteLine("Input a char");
string response = Console.ReadLine();
char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
switch (responseChar)
{
case 'X':
isFinished = true;
break;
default:
// 得到按键信息的参数
KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);
//事件的触发点。通过使用监听对象的对外释放方法,触发执行keyMonitor.KeyDown事件,
//而keyMonitor.KeyDown有绑定keyReiever.Echo具体的处理函数
keyMonitor.OnKeyDown(keyEventArgs);
break;
}
} while (!isFinished);
}
}
//keyMonitor.KeyDown事件触发的处理类
public static class keyReiever
{
//keyMonitor.KeyDown事件触发时,响应的处理方法。具体参数参考事件委托的定义
public static void Echo(object sender, KeyEventArgs e)
{
Console.WriteLine("You input char : " + e.get_Key().ToString());
}
}
{
public User()
{
//监听对象
keyCharMonitor keyMonitor = new keyCharMonitor();
//.net framework 1.0/1.1 的方法,绑定事件触发时的处理函数
keyMonitor.KeyDown += new keyCharMonitor.KeyEventHandler(keyReiever.Echo);
////.net framework 2.0的方法,可以使用泛型
////EventHandler<KeyEventArgs>包含在系统中
//keyMonitor.KeyDown += new EventHandler<KeyEventArgs>(keyReiever.Echo);
bool isFinished = false;
do
{
Console.WriteLine("Input a char");
string response = Console.ReadLine();
char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
switch (responseChar)
{
case 'X':
isFinished = true;
break;
default:
// 得到按键信息的参数
KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);
//事件的触发点。通过使用监听对象的对外释放方法,触发执行keyMonitor.KeyDown事件,
//而keyMonitor.KeyDown有绑定keyReiever.Echo具体的处理函数
keyMonitor.OnKeyDown(keyEventArgs);
break;
}
} while (!isFinished);
}
}
//keyMonitor.KeyDown事件触发的处理类
public static class keyReiever
{
//keyMonitor.KeyDown事件触发时,响应的处理方法。具体参数参考事件委托的定义
public static void Echo(object sender, KeyEventArgs e)
{
Console.WriteLine("You input char : " + e.get_Key().ToString());
}
}
2、第二种使用EventHandlerList来管理事件。组件或者控件在初始化了之后,并不是每个组件都会去触发其定义的事件,而使用了第一种方式的每个事件组件对象都要开辟内存区维护它,这样造成内存消耗大,释放后亦消耗cup去清除使用的内存,所以我们引进了第二种方式:
定义部分:
public class someClass{
static readonly object workEventKey= new object();
//这里的EventHandlerList是静态声明的,也可以根据事件动态声明
protected EventHandlerList eventDelegates=new EventHandlerList();
public event EventHandler<WorkEventArgs> work //这个和第一中方法中申明方法十分相似
{
add
{
//模板:AddHandler(object key,Delegates value);
this.eventDelegates.AddHandler(workEventKey,value);
}
remove
{
//模板:RemoveHandler(object key,Delegates value);
this.eventDelegates.RemoveHandler(workEventKey,value);
}
}
//触发这个事件的方法
protected void OnWork(WorkEventArgs e)
{
EventHandler<WorkEventArgs> workEventDelegate=
(EventHandler<WorkEventArgs>)this.eventDelegates[workEventKey];
if(workEventDelegate!=null)
{
workEventDelegate(this,e);
}
}
}
二、Mircosoft Ajax Library事件定义
MS Ajax Library事件的定义类似于c#中的第二种方式。
定义部分:
MS Ajax Lib还有事件的Demo类
Type.registerNamespace("Demo");
Demo.Firer = function()
{
this._events = null;
}
Demo.Firer.prototype =
{
//动态获得Sys.EventHandlerList
_get_events: function() {
if (!this._events) {
this._events = new Sys.EventHandlerList();
}
return this._events;
},
//往EventHandlerList添加/删除事件的Delegate
add_fire: function(handler) {
this._get_events().addHandler("fire", handler);
},
remove_fire: function(handler) {
this._get_events().removeHandler("fire", handler);
},
//对外提供的事件释放处
raiseFire: function(e) {
//得到对应的事件Delegate
var handler = this._get_events().getHandler("fire");
if (handler) {
//执行Delegate代理事件
handler(this, e);
}
},
//使用了上述的对外释放的事件
fireAfter: function(seconds) {
setTimeout(
Function.createDelegate(this, function() { this.raiseFire(Sys.EventArgs.Empty); }),
seconds * 1000);
}
}
Demo.Firer.registerClass("Demo.Firer");
Demo.Firer = function()
{
this._events = null;
}
Demo.Firer.prototype =
{
//动态获得Sys.EventHandlerList
_get_events: function() {
if (!this._events) {
this._events = new Sys.EventHandlerList();
}
return this._events;
},
//往EventHandlerList添加/删除事件的Delegate
add_fire: function(handler) {
this._get_events().addHandler("fire", handler);
},
remove_fire: function(handler) {
this._get_events().removeHandler("fire", handler);
},
//对外提供的事件释放处
raiseFire: function(e) {
//得到对应的事件Delegate
var handler = this._get_events().getHandler("fire");
if (handler) {
//执行Delegate代理事件
handler(this, e);
}
},
//使用了上述的对外释放的事件
fireAfter: function(seconds) {
setTimeout(
Function.createDelegate(this, function() { this.raiseFire(Sys.EventArgs.Empty); }),
seconds * 1000);
}
}
Demo.Firer.registerClass("Demo.Firer");
演示代码下载:
1、 C#.Net事件 [ 方法一] Demo1下载
1、 C#.Net事件 [ 方法二] Demo2下载