2013-07-17 82 views
2

我在一週前接受了一次採訪,其中一個問題是OnInit,Page_Init和PreRender之間的區別。哪一個更好?Page_Init與OnInit的區別

+1

適合做什麼?另外,ASP.NET文檔不會涵蓋這個? – millimoose

+0

而且,即使您關閉了自動事件連線,OnInit()也會觸發。也就是說,OnXxx()方法應該被用來改變是否/如何引發事件的邏輯,而不是處理它。 (雖然它主要是一種洗滌。)它也可以讓你在常規的'OnInit()'邏輯之前做一些事情,但是再次你的代碼的正確行爲不應該取決於那些時間細節,對我來說似乎非常脆弱。我不知道爲什麼要提到'PreRender',它在頁面渲染生命週期的反面,應該用於完全不同的目的。 – millimoose

+1

你確定問題不是'Page_Init','Page_Load'和'Page_PreRender'有什麼區別嗎? –

回答

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方法更快(但是這是一個microptimisation,你只節省一對夫婦爲代表派遣額外的指令)和許多「純粹主義者」會說不必要地使用事件只是醜陋:)

不使用事件的另一個優點是避免了由AutoEventWireUp引起的錯誤,這可能會導致事件被每次頁面加載調用兩次,如果事件處理程序不是冪等。