程序开发中,经常会出现一些很郁闷的问题,怎么看怎么不该有错,却有偏偏有错,其实错误往往在一些不经意的角落,甚至一些你认为“不可能错”的地方。我们经常会把一些如验证信息等功能写在一个页面基类中,但是这样的页面有时候总会在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句:
InitializeComponent();
base.OnInit(e);
请注意这里的base ,在平时,这个base是指向页面类的父类,即System.Web.UI.Page 那么在InitializeComponent();以后再执行OnInit,是没有问题的,不过现在页面类基类换成我们自己的页面基类,我们可能会在页面基类中执行一些操作,比如在PageLoad中~~
请注意,如果base.OnInit(e)没有在InitializeComponent()之前调用的话,所有页面基类Page_Load事件处理程序都将不会在当前页面上的Page_Load事件处理程序之前执行。这样的话,当前页面的Page_Load事件处理程序中如果用到页面基类的Page_Load事件处理程序中的实例化的类时,就会有出现问题。
错误最后找到了,恰恰是发生在“不可能错”的地方,系统自动生成的代码。
如果所有的其他可能都被排除,那么剩下的最后一种可能,无论多么离奇和难以置信,它都是真的
于细微处见精神