在调试程序时,我们检查代码的过程通常会跳过那些自己认为绝对不可能出错的代码或逻辑。然而有时候,当检查了一遍又一遍却找不到任何出错的可能性,而程序却的的确确不是按我们所设想的那样在运行。这时,很多人就认为自己遇到了灵异事件。这种体验几乎每个程序员都有过,但最终往往事实证明,是我们自己错了,错在不应该太坚信自己的习惯写法。
事例一:
2p.Visible = AllowDisplay;
3if (p.Visible) {
4 //do something;
5}
注:p是aspx页面上声明的一个<p runat="server" id="p">...</p>标签。
在运行时发现,无论如何都执行不到if语句内部的do something部分的代码,即使调试时AllowDisplay的值明明为True也是如此!
以前写代码时经常采用类似的做法,都没出过任何问题,然后现在这个简单至极的代码却让人摸不着头脑了。
最后经过多番调试,才找到原因:p的上级容器控件的声明代码中因客观需要,被设置了Visible="false"! 所以,尽管控件的Visible属性不是只读属性,也不能贸然以为给它设置了什么它就会是什么。
事例二:
2if (obj == null){
3 //do something;
4}
程序运行时,同样无法执行到if语句内部的do something部分的代码。这倒不奇怪,奇怪的是,调试发现,在“if (obj == null)”这一行代码中出现了异常!
按说,无论你obj是不是为空引用,这儿也不应该出错呀,这行代码在我的C#编程生涯中可是写了无数次的,怎么突然就出问题了呢?
在CSDN上问了,也有很多人回答了,但没一个人说到真正的症结所在。不得已,只能自己不停地动脑筋加调试,最后找到原因了。这是由于在OneClass这个类定义的操作符重载中,==操作符重载代码中缺少了对目标对象是否为空引用的判断,所以在程序运行到“if (obj == null)”时,就陷入了死循环!
对于这个问题,昨天园子里一位朋友也提出了更好的编码方式,那就是写成:if (null == obj)。
以上都是我在参与开发一个“通用信息管理系统”项目的过程中遇到的一些问题。类似的貌似诡异的现象还有不少,不过大多都在通过搜索网络后得到了答案,就不一一列出了。
最后,请容许我用一行文字宣传一下我们的作品吧:如果您困扰于ERP的昂贵和繁杂,那么请到http://landian.cc体验一下蓝点通用管理系统的清爽、时尚和灵活吧,您一定会爱上她!