程序开发中,经常会出现一些很郁闷的问题,怎么看怎么不该有错,却有偏偏有错,其实错误往往在一些不经意的角落,甚至一些你认为“不可能错”的地方。我们经常会把一些如验证信息等功能写在一个页面基类中,但是这样的页面有时候总会在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事件处理程序中的实例化的类时,就会有出现问题。
错误最后找到了,恰恰是发生在“不可能错”的地方,系统自动生成的代码。
如果所有的其他可能都被排除,那么剩下的最后一种可能,无论多么离奇和难以置信,它都是真的
于细微处见精神