王华亮的监控

博客园 首页 新随笔 联系 订阅 管理
  35 Posts :: 3 Stories :: 70 Comments :: 0 Trackbacks
前两天在PConline上看到一篇“论全世界所有程序员都会犯的错误”(网上有很多,好像是转贴的),
http://www.pconline.com.cn/pcedu/empolder/gj/java/0509/695483.html
说的是JAVA中使用静态对象出错的问题,没仔细看,只觉得他的那个实例在C#上好像
不会有这样的错误。想不到,今天,花了我好几个小时找的BUG,原来竟然是同样的错误
我的实例,我用一个类来存储图片实例(Bitmap),然后用一个列表(ArrayList)来保存多个
这样的类的实例,但是我发现每次重画的时候,被来取得不相同的图片,画的都是同一个图片,
而且是最后加入的那个类存储的图片,百思不得其解,最后发现我竟然把Bitmap声明成一个
静态的变量了. Private static Bitmap surface;阿!太粗心了.
用IL反编译,在结构化处定义
 IL_0001:  stsfld     class [System.Drawing]System.Drawing.Bitmap SKEP.MS.ControlLib.DeviceIcon::surface;
因此你把类加入队列的时候,静态的变量确是放在其他的内存区的(不知道这样理解对不对),
最终得结果是后来的Bitmap不断的覆盖,你取得Bitmap永远是最后加入的,欢迎大家来讨论,谢谢!
今天仔细看这篇文章,发现在文章最后有这么一段字
 其实Java的syntactic sugar并不算多,C#的syntactic sugar才真的是无所不在,也因此C#的初学者更容易犯了“全世界所有程序员都会犯的错误”。
附博客中静态对象的文章
http://lixianhuei.cnblogs.com/archive/2005/08/31/227274.html

 
posted on 2005-09-08 14:46 wanghualiang 阅读(1616) 评论(13)  编辑 收藏 所属分类: 静态对象

Feedback

#1楼  2005-09-08 15:10 QuitGame      
不见的会犯这种错误
只是对象和对象引用的问题啊
  回复  引用  查看    

#2楼  2005-09-08 15:11 Bruce      
犯错误好啊
  回复  引用  查看    

#3楼  2005-09-08 16:17 flower.b      
Bitmap 本身是句柄,复制给picturebox时要重新实例化。
  回复  引用  查看    

#4楼  2005-09-08 16:31 wanghualiang      
@flower.b
Bitmap是个句柄???不是很懂,
我没有复制给pictureBox,当然我实例化了,我是在界面上直接绘图的。
我这里要说明的是静态变量存放位置,和我们对对象变量引用的一些常规
概念的不同所引发的问题。

  回复  引用  查看    

#5楼  2005-09-08 17:23 birdshome      
不知能不能弄点全宇宙程序员都会犯的错误出来?!
  回复  引用  查看    

#6楼  2005-09-08 19:10 xiao_p [未注册用户]
Bitmap 当然是个句柄啊 还可以叫reference thinking in java好像是这么叫的
  回复  引用    

#7楼  2005-09-08 20:23 FantasySoft      
为什么称之为静态变量呢? 是因为它的存在依赖Class,而非instance。
  回复  引用  查看    

#8楼  2005-09-08 20:23 AlleNny [未注册用户]
如果我不犯这个错误,那我岂不是不能算程序员了?看来得找机会犯一次。
  回复  引用    

关于static的错误,我已经在我的blog中做了总结.

你可以看看哦..

http://lixianhuei.cnblogs.com/archive/2005/08/31/227274.html
  回复  引用    

#10楼  2005-09-09 09:12 Kevin      
感觉是在搞噱头。
  回复  引用  查看    

#11楼  2005-09-09 09:19 wanghualiang      
@kevin
不是噱头,只是一篇文章的转述,
不过这个错误确实是很容易犯的。

  回复  引用  查看    

#12楼  2005-09-09 10:49 yinh      
不看引文,光看本文的这些内容,不明白要讲什么,讲的是静态变量的使用这个错误很容易犯吗?
其实没事儿用静态变量干嘛?很容易犯就更谈不上了吧。
  回复  引用  查看    

#13楼  2005-09-09 11:13 jun      
你的这个错误和那篇java的“全世界通用错误”其实是两个不同错误。你是忘了static是一个共享的变量,而java的是没有搞清初始化的顺序。
  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-09-09 09:10 编辑过


相关链接: