论全世界所有程序员都会犯的错误(C#)希望大家不会犯。
前两天在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
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