Page_Init与OnInit之间的区别

时间:2013-07-17 19:13:25

标签: asp.net webforms

我在一周前接受过采访,其中一个问题是OnInit,Page_Init和PreRender之间的区别。哪个更好?

1 个答案:

答案 0 :(得分:4)

Page_InitPage.Init事件的事件处理程序,如果在类本身中添加处理程序,通常会看到它。

OnInit是一种提升Init事件的方法。

如果在子类中使用它们,可以看作是等效的,但是有区别:只有Init暴露给其他类型,OnInit方法是受保护且负责提升事件,因此如果您覆盖OnInit并且未能致电base.OnInit,则不会触发Init事件。这是它的样子:

public class Page {

    public event EventHandler Init;
    public event EventHandler Load;

    protected virtual void OnInit(Object sender, EventArgs e) {
        if( this.Init != null ) this.Init(sender, e);
    }

    protected virtual void OnLoad(Object sender, EventArgs e) {
        if( this.Load != null ) this.Load(sender, e);
    }

    public void ExecutePageLifecylce() {
        this.OnInit();
        // do some houskeeping here
        this.OnLoad();
        // further housekeeping
        this.Dispose();
    }
}

public class MyPage : Page {

    public MyPage() {

        this.Init += new EventHandler( MyPage_Init );
    }

    private void MyPage_Init(Object sender, EventArgs e) {
        // No additional calls are necessary here
    }

    protected override void OnLoad(Object sender, EventArgs e) {
        // you must make this following call for any .Load event handlers to be called
        base.OnLoad(sender, e);
    }
}

通常覆盖OnLoad / OnInit方法的速度更快(但这是一个微观优化,你只需要为代理调度保存一些额外的指令),许多“纯粹主义者”会争论使用事件不必要的只是丑陋:))

不使用事件的另一个好处是避免了由AutoEventWireUp引起的错误,这些错误可能导致每个页面加载调用两次事件,如果您的事件处理程序不是幂等的,这显然是不可取的。