java事件链效率_高效率事件集合对象

高效率事件集合对象

本文节选自《庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术》一书

在之前讲的几个例子中,使用的是最普通的定义事件方法,比如KingTextBox中事件是这样定义的:

///

/// 获得本书更多内容,请看:

/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx

///

public event EventHandler TextChanged;

protected virtual void OnTextChanged(EventArgs e)

{

if (TextChanged != null)

{

TextChanged(this, e);

}

}

在复合控件中,事件一般比较多,如果仍然基于以上普通事件的实现方法来定义事件,就会定义许多事件委托实现对象,导致占用较多内存存储。

在这种情况下,则应该通过System.ComponentModel.EventHandlerList集合类来保存事件,原因是使用此类在多个事件的声明过程中比普通的实现方法效率高。EventHandlerList类提供一个简单的委托列表来添加(Events.AddHandler)和删除(Events.RemoveHandler)委托,在Control基类中已经定义好了EventHandlerList类型的对象Events,因此可以直接通过base.Events访问事件列表对象。

下面利用Events集合对象存储事件,修改一下KingTextBox控件的事件声明/调用部分,为了保留KingTextBox现有功能,新增一个控件示例,控件名称为KingTextBoxUseEvents。事件部分的代码为:

///

/// 获得本书更多内容,请看:

/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx

///

private static readonly object TextChangedKeyObject = new object();

public event EventHandler TextChanged

{

add

{

base.Events.AddHandler(KingTextBoxUseEvents.TextChangedKeyObject, value);

}

remove

{

base.Events.RemoveHandler(KingTextBoxUseEvents.TextChangedKeyObject,

value);

}

}

protected virtual void OnTextChanged(EventArgs e)

{

EventHandler handler = base.Events[KingTextBoxUseEvents.TextChanged

KeyObject] as EventHandler;

if (handler != null)

{

handler(this, e);

}

}

以上代码首先定义了一个Object对象TextChangedKeyObject,用于当存储事件到Events列表时,作为TextChanged事件的Key,其对应Value为即为事件方法体。接下来定义了一个事件委托类型的TextChanged属性,其内容包括一个add和一个remove子句,在这两个子句中分别完成注册和释放事件功能。最后的OnTextChanged方法也稍微变了一下,增加了从base.Events事件列表中根据TextChangedKeyObject键得到事件句柄的代码语句,如果取得的句柄handler不为null,即可引发开发人员注册的事件。

控件KingTextBoxUseEvents代码也比较简单,下面也把它的完整代码展示出来:

///

/// 获得本书更多内容,请看:

/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx

///

[DefaultProperty("Text")]

[ToolboxData("{0}:KingTextBoxUseEvents>")]

public class KingTextBoxUseEvents : Control, IPostBackDataHandler

{

public KingTextBoxUseEvents()

{

}

///

/// 设置或获取显示文本

///

public string Text

{

get

{

String s = (String)ViewState["Text"];

return ((s == null) ? String.Empty : s);

}

set

{

ViewState["Text"] = value;

}

}

///

/// 生成呈现HTML格式标记

///

///

protected override void Render(HtmlTextWriter writer)

{

StringBuilder sb = new StringBuilder();

sb.Append("

sb.Append(" value=");

sb.Append("/"" + HttpUtility.HtmlEncode(Text) + "/"");

sb.Append(" />");

writer.Write(sb.ToString());

}

public virtual bool LoadPostData(string postDataKey, NameValueCollection

postCollection)

{

string strOldValue = Text;

string strNewValue = postCollection[this.UniqueID];

if( strOldValue == null || ( strOldValue != null && !strOldValue.Equals

(strNewValue)))

{

this.Text = strNewValue;

return true;

}

return false;

}

public virtual void RaisePostDataChangedEvent()

{

OnTextChanged(EventArgs.Empty);

}

//高效事件

private static readonly object TextChangedKeyObject = new object();

public event EventHandler TextChanged

{

add

{

base.Events.AddHandler(KingTextBoxUseEvents.TextChangedKeyObject, value);

}

remove

{

base.Events.RemoveHandler(KingTextBoxUseEvents.TextChanged

KeyObject, value);

}

}

protected virtual void OnTextChanged(EventArgs e)

{

EventHandler handler =base.Events[KingTextBoxUseEvents.TextChanged KeyObject] as EventHandler;

if (handler != null)

{

handler(this, e);

}

}

}

KingTextBoxUseEvents控件与KingTextBox功能完全相同,应用方法也相同。另外,事件的委托和参数对象也可以自定义,下一节就讲一下如何定制自己的委托和事件对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值