当前位置:编程学习 > C#/ASP.NET >>

这一行代码在整个程序是起什么用的

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 //定义事件的委托
        {
            add
            {
                Events.AddHandler(ClickKey, value);
            }
            remove
            {
                Events.RemoveHandler(ClickKey, value);
            }
        }
--------------------编程问答-------------------- 类似 get/set。 --------------------编程问答-------------------- 事件是一个多播的委托链。

你看到的 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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,