天天看點

查找疑難雜症--于細微處見精神

程式開發中,經常會出現一些很郁悶的問題,怎麼看怎麼不該有錯,卻有偏偏有錯,其實錯誤往往在一些不經意的角落,甚至一些你認為“不可能錯”的地方。我們經常會把一些如驗證資訊等功能寫在一個頁面基類中,但是這樣的頁面有時候總會在pageload裡出問題,很郁悶的問題,如轉換無效之類的,如果按照頭痛醫頭腳痛醫腳的方法,查出錯的語句,往往怎麼查都沒錯,檢視所有代碼,你會發現都沒有錯。福爾摩斯說過“如果所有的其他可能都被排除,那麼剩下的最後一種可能,無論多麼離奇和難以置信,它都是真的”沒錯,檢視了所有代碼都沒錯,你還少看了哪裡???對了,那些系統自動隐藏的,寫着“窗體設計器生成的代碼”的部分,的确是自動生成的代碼錯了,也許你看一眼,沒錯啊,平常都是這樣的,都對啊。我們看看平常情況:

#region web 窗體設計器生成的代碼

  override protected void oninit(eventargs e)

  {

   //

   // codegen: 該調用是 asp.net web 窗體設計器所必需的。

   initializecomponent();

   base.oninit(e);

  }

  /// <summary>

  /// 設計器支援所需的方法 - 不要使用代碼編輯器修改

  /// 此方法的内容。

  /// </summary>

  private void initializecomponent()

  {    

   this.load += new system.eventhandler(this.page_load);

  #endregion

看不出有什麼問題吧?其實這個時候是考驗細心和對系統工作認識是否足夠的時候。請注意這2句:

請注意這裡的base ,在平時,這個base是指向頁面類的父類,即system.web.ui.page 那麼在initializecomponent();以後再執行oninit,是沒有問題的,不過現在頁面類基類換成我們自己的頁面基類,我們可能會在頁面基類中執行一些操作,比如在pageload中~~

請注意,如果base.oninit(e)沒有在initializecomponent()之前調用的話,所有頁面基類page_load事件處理程式都将不會在目前頁面上的page_load事件處理程式之前執行。這樣的話,目前頁面的page_load事件處理程式中如果用到頁面基類的page_load事件處理程式中的執行個體化的類時,就會有出現問題。

錯誤最後找到了,恰恰是發生在“不可能錯”的地方,系統自動生成的代碼。

如果所有的其他可能都被排除,那麼剩下的最後一種可能,無論多麼離奇和難以置信,它都是真的

于細微處見精神

繼續閱讀