其實看到這個標題,我想一些人應該知道我們要談論.cs類的實際應用。以前我是ASP程式員,那時候用VBS指令碼編程,如果要使用其他方法(比如公用的方法)就得include一些function.asp,就像js的運行一樣也要先引用其他的js函數。 所以,轉到ASP.NET後,我也沒在意類這個東西,也不清楚靜態和非靜態區別,反正就是執行個體化後就可以調用其方法就行了,而aspx.cs裡面都是寫方法的,就是一股腦的還是以前的編程模式。或許有些人也有這種經曆,但是我們不能一直這樣渾渾噩噩的編程,應該清楚方法是如何執行的,我們如何設計類。隨便建立一個ASPX頁(我這裡只用ASP.NET Web Application,而不是WebSite),都會產生page.aspx\page.aspx.desinger.cs和page.aspx.cs,開啟2個.cs檔案,會發現其中一個是讓我們寫方法的,另外一個就是記錄我們使用的控制項(desginer.cs)。 在VS2003的時候,desginer.cs是不存在的,所有的控制項聲明都在.cs裡,而且預設還會產生一些代碼(如下): #region Web 表單設計器產生的程式碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 該調用是 ASP.NET Web 表單設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 設計器支援所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
{
}
#endregion
我們可以看到 OnInit是初始化事件的方法,預設被重寫,因為要執行InitializeComponent這個私人方法,因為InitializeComponent方法每個頁面都不一樣,之所以不一樣是因為他主要是用來給控制項的事件訂閱者法,比如Button1的Click如果有具體行為,就會在這裡增加this.Button1.Click += new EventHandler(Button1_Click);這樣按鈕在被點擊的時候就會執行Button1_Click這個方法了,這些訂閱代碼VS是自動添加的(雖然你可以手動去改他們),2005以後就被隱匿了(內部已經幫我們實現了)。
由此,我們可以想象到,類的執行順序,OnInit -> InitializeComponent -> Page_Load -> Your Function。當然還有其他的事件方法,我們接著看。【注意】這是經常考的面試題:ASP.NET的生命週期!所謂生命週期,我們都知道一個變數的範圍,一個對象從建立到銷毀就是他的生命週期。所以這個考題就是在考你的(PageName)頁面類的執行個體的執行順序。 執行完了自然就沒了。我們建立的頁面都是繼承自System.Web.UI.Page類,所以基本上就是要看Page類的執行順序。詳情看官方解釋:http://msdn.microsoft.com/zh-cn/library/ms178472(VS.80).aspx,其中介紹了整個過程和相關的事件。其實Page類也是繼承自Control類,所以Page也是個Control哦,所以生命週期裡的一些事件,其實是Control的,比如OnInit,OnLoad,OnPreRender,OnUnload,OnDataBinding,所以其他的控制項也都支援這些事件。在我們開發自訂控制項的時候,也可以操作這些事件,來自訂我們的控制項特性。