一周前我参加了一次面试,其中一个问题是 OnInit、Page_Init 和 PreRender 之间有什么区别。哪一个更可取?
最佳答案
Page_Init
是 Page.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/