日期:2014-05-18  浏览次数:20429 次

一个C#2.0中执行顺序问题
下面有这么一个例子:
public   partial   class   Default7   :   System.Web.UI.Page
{
       
        protected   override   void   OnInit(EventArgs   e)
        {
                this.Button1.Click   +=   delegate   {   Response.Write(1   +   " <br> ");   };
                base.OnInit(e);
        }
        protected   void   Button1_Click(object   sender,   EventArgs   e)
        {
                Response.Write(2   +   " <br> ");
        }
}
得到的结果是
2
1
为什么不是先执行匿名函数,而是先执行Resopnse.Write(2+ " <br> ");为什么结果不是
1
2
呢?




------解决方案--------------------
protected override void OnInit(EventArgs e)
{
this.Button1.Click += delegate { Response.Write(1 + " <br> "); };
base.OnInit(e);
}
是在页面生成的时候发生。
------------
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(2 + " <br> ");
}

他的定义是在类构造的时候就生成了,我的想法是winform不知道webform是不是这样,不过应该差不多
------解决方案--------------------
点出按钮时执行Click事件,2
同时由于是服务器事件,
页面刷新OnInit()1
OnLoad()
------解决方案--------------------
Click事件同时触发两个动作,应该是C#的内部机制来决定谁先执行的
------解决方案--------------------
Button1 Click之后的执行顺序为
OnInit-> Button1_Click-> delegate{Response.Write(1 + " <br> "); }
每次Click都会为Button1重新添加委托,也就是说第一次加载时的那个委托并不保存,而只是将该事件添加到Button1的响应队列里,优先级应该在Button1_Click之后
------解决方案--------------------
protected override void OnInit(EventArgs e)
//初始化页面时执行
protected void Button1_Click(object sender, EventArgs e)
//双击后才执行
C#的运行机制可能是先执行点击事件然后再执行页面加载事件。。

------解决方案--------------------
《C#高级编程》里有这样一句话:
  多播委托,不能保证调用方法的顺序
------解决方案--------------------
C#的底层机制来决定,我们记住这些规律就行了


------解决方案--------------------
up