English Version: http://dflying.dflying.net/1/archive/101_prefer_overrides_to_event_handlers_in_aspnet_page.html
這個是我們熟悉的Page_Load()方法。實際上它是一個Event Handler,當定義在System.Web.UI.Page中的Load事件觸發時,它就會開始執行。
// use event handler
protected void Page_Load(object sender, EventArgs e)
{
// logic here
}
這個是System.Web.UI.Page類別中OnLoad()方法的Override。 // use override
protected override void OnLoad(EventArgs e)
{
// logic here
base.OnLoad(e);
}
雖然上述兩種做法都能完成相同的功能,但我推薦使用Override的做法。
首先,事件處理機制是用來實現獨立的物件之間通訊的。例如,當一個Button被點擊時,頁面可以透過事件處理機制得知這一訊息並進行處理。但在這個例子中,Load事件定義在System.Web.UI.Page中,本身也是我們頁面中的一部分。這樣在一個類別的內部發出事件並又在其本身處理這個事件的做法將會顯得很奇怪。
其次,效率上考慮,事件處理不如Override。這是由.NET Framework的實作所決定的並且我們都已經了解。
還有,使用事件時需要維護兩個地方:事件處理方法的載入(attach)以及事件處理函數本身的定義。雖然ASP.NET 2.0已經提供了一些預先定義的事件處理方法名,但還有許多開發者在使用ASP.NET 1.1。而使用Override則只需要維護Override函數本身。
當然,事件處理機制有它本身的好處,例如可以很方便的在運行時指定事件處理方法,允許分佈在各處的多個事件處理方法依次執行。但在ASP.NET頁面中我們不會用到這些特性。我們總會有一個方法來定義頁面被載入的行為,我們也不會有多個Page_Load()方法在一個頁面中出現。
更泛化一點,不單單在ASP.NET頁面中,其他情況下我們也應該盡可能的使用Override而不是Event。
使用Override的時候要注意的是不要忘記呼叫基底類別的方法(Visual Studio會替你做好的)。
出處:Dflying Chen BLOG