天天看点

查找疑难杂症--于细微处见精神

程序开发中,经常会出现一些很郁闷的问题,怎么看怎么不该有错,却有偏偏有错,其实错误往往在一些不经意的角落,甚至一些你认为“不可能错”的地方。我们经常会把一些如验证信息等功能写在一个页面基类中,但是这样的页面有时候总会在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事件处理程序中的实例化的类时,就会有出现问题。

错误最后找到了,恰恰是发生在“不可能错”的地方,系统自动生成的代码。

如果所有的其他可能都被排除,那么剩下的最后一种可能,无论多么离奇和难以置信,它都是真的

于细微处见精神

继续阅读