asp.net - Page_Init 与 OnInit 之间的区别

标签 asp.net webforms

一周前我参加了一次面试,其中一个问题是 OnInit、Page_Init 和 PreRender 之间有什么区别。哪一个更可取?

最佳答案

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

OnInit 是引发 Init 事件的方法。

如果在子类中使用,两者可以被视为等效,但有一个区别:只有 Init 暴露给其他类型,OnInit 方法 protected 并负责引发事件,因此如果您重写 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 方法会更快(但这是一个微优化,您只是为委托(delegate)调度节省了一些额外的指令)和许多“纯粹主义者”会认为不必要地使用事件是丑陋的:)

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

关于asp.net - Page_Init 与 OnInit 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17708295/

相关文章:

c# - ASP.NET 请求...如何处理 Linq DataContext?

javascript - 在 ASP.NET 代码中通过 javascript 发出警报后停止回发

c# - 如何让注册的用户控件在 C# 中进行代码隐藏?

vb.net - 检查应用程序是 mvc、WebForms 还是两者兼而有之

php - 为什么 Post/Redirect/Get 模式(PRG 模式)有效?

asp.net - 结合CLR类库发布ASP.NET vNext/DNX

asp.net - ASP.NET Core 中的性能计数器在哪里?

asp.net-mvc - 将 ASP.Net MVC 与 WebForms 结合起来

webforms - 在 .Net 中使用 <button> 而不是 &lt;input&gt;

asp.net - 这些<% ... %>是什么?以及在页面中可以通过哪些方式使用它们