这一行代码在整个程序是起什么用的
namespace MyButton
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:MyButton runat=server></{0}:MyButton>")]
public class MyButton : WebControl, IPostBackEventHandler
{
private static readonly object ClickKey = new object();
public event EventHandler Click //定义事件的委托
{
add
{
Events.AddHandler(ClickKey, value);
}
remove
{
Events.RemoveHandler(ClickKey, value);
}
}
protected virtual void OnClick(EventArgs e)//定义单击事件的处理程序
{
EventHandler clickEventDelegate = (EventHandler)Events[ClickKey];
if (clickEventDelegate != null)
{
clickEventDelegate(this, e);
}
}
public void RaisePostBackEvent(string eventArgument)//处理回发事件
{
OnClick(new EventArgs());
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write("<INPUT TYPE=submit name=" + this.UniqueID +
" Value='这是自己定制的按钮!' />");
}
}
}
下面这一片代码有什么用呢
public event EventHandler Click //定义事件的委托--------------------编程问答-------------------- 类似 get/set。 --------------------编程问答-------------------- 事件是一个多播的委托链。
{
add
{
Events.AddHandler(ClickKey, value);
}
remove
{
Events.RemoveHandler(ClickKey, value);
}
}
你看到的 Click += EventHandler 其实就是 Click.Add(EventHandler) --------------------编程问答-------------------- 在功能上,它很你在类型中写这样的代码是等价的:
public EventHandler Click;然后客户程序就可以使用
MyButton1.Click += ......;方法来注册、撤销事件处理程序了。
MyButton1.Click -= ......;
但是,系统类库中的控件普遍都有很多事件。假设平均每个控件有30个事件,假设一个窗口里有1000个控件,那么一个窗口里就有30000个事件对象。尽管客户程序没有向其注册事件处理程序,也要占用30000个事件对象的存储空间。
为了少占用一点空间,也是因为.net一开始就是这样在它们内部推广的原因吧,它们不使用上面比较标准和简单的事件定义方法。而是在控件的父类中定了一个Events列表。这样,从其继承的子控件,每一个对象都会有一个Events列表。当客户程序没有向其注册事件事件处理程序,那么就不占用空间。注册了事件处理程序,相应的事件对象才会被加入Events列表中,占用空间。当然,每个控件的Events列表中的每个单元声明时都是父类EventHandler,而要有一个标记说明它是具体对应哪个具体事件,所以使用static的对象(比如对于Click事件就是ClickKey)来做为标记。这些static的对象在类型中创建,而不是在控件对象中创建。所以最终,当窗体上有很多控件时,这种机制可以少为事件预先分配许多空间。
这是.net中控件的事件机制的一个基本知识。我们自己设计自定义控件,我倒是觉得不一定有必要学.net类库设计,使用简单标准的
public event EventHandler Click;似乎也不会对程序性能和空间造成什么伤害。。 --------------------编程问答-------------------- 第一个代码写错了,少写了一个event单词。参见最下边的一行。
补充:.NET技术 , ASP.NET