2

一周前我进行了一次面试,其中一个问题是 OnInit、Page_Init 和 PreRender 之间的区别。哪个更可取?

4

1 回答 1

4

Page_Init是事件的事件处理程序,Page.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可能导致事件在每次页面加载时被调用两次的错误,如果您的事件处理程序不是幂等的,这显然是不可取的。

于 2013-07-17T19:35:26.660 回答