2
我在一週前接受了一次採訪,其中一個問題是OnInit,Page_Init和PreRender之間的區別。哪一個更好?Page_Init與OnInit的區別
我在一週前接受了一次採訪,其中一個問題是OnInit,Page_Init和PreRender之間的區別。哪一個更好?Page_Init與OnInit的區別
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
方法更快(但是這是一個microptimisation,你只節省一對夫婦爲代表派遣額外的指令)和許多「純粹主義者」會說不必要地使用事件只是醜陋:)
不使用事件的另一個優點是避免了由AutoEventWireUp
引起的錯誤,這可能會導致事件被每次頁面加載調用兩次,如果事件處理程序不是冪等。
適合做什麼?另外,ASP.NET文檔不會涵蓋這個? – millimoose
而且,即使您關閉了自動事件連線,OnInit()也會觸發。也就是說,OnXxx()方法應該被用來改變是否/如何引發事件的邏輯,而不是處理它。 (雖然它主要是一種洗滌。)它也可以讓你在常規的'OnInit()'邏輯之前做一些事情,但是再次你的代碼的正確行爲不應該取決於那些時間細節,對我來說似乎非常脆弱。我不知道爲什麼要提到'PreRender',它在頁面渲染生命週期的反面,應該用於完全不同的目的。 – millimoose
你確定問題不是'Page_Init','Page_Load'和'Page_PreRender'有什麼區別嗎? –