以下将我收到的邮件中读者常问的问题进行统一回答。欢迎读者反馈各种意见。
(有关问题我会以评论的方式及时在此跟贴,时时更新)
问:
您好,金老师,我是贵书《编程的奥秘》的读者,虽然还未读完,但能感受到您对编程的热情以及对教育事业的努力,请允许我说一声“谢谢”,下边说一下我在读贵书时遇到的困惑。
环境:win2000pre+VS.NET 2003
问题:几乎每个例子编译时都会提示:“未处理的“System.ArithmeticException”类型的异常出现在 system.drawing.dll 中。其他信息: 算术运算中发生溢出或下溢。”
,之后我请教过别人,但他们的办法我试后无效。我曾怀疑是编译器的问题,但在网上DOWN了三个IOS文件,安装后出现同样的问题,另外,我按书中打源代码编译时问题一样出现。您经验比我丰富,或许知道问题的原因,所以我发信一封想您请教。
恳请金老师帮忙,为谢!!!
回复:
如果是每个例子都无法编译,那只能肯定是VS.NET未安装好。最简单的办法是安装一个“干净的”的Windows,然后先安装VS.NET,成功以后再安装其它软件。另一原因是病毒影响,GDI+(刚好在System.Drawing.DLL中)有个漏洞,可被病毒利用,微软发布过相关补丁。
--------------------------------------------------------------------------------------------------------
问:
今天把您的著作粗略的读完了,信心很足,打开vs.net准备写点东西.
但是一开始就遇到了麻烦,虽然解决了但是心中还存有疑虑
'点击按钮出现一个窗体
Private fm1 As form1
If fm1 Is Nothing Then
fm1 = New form1
fm1.Show()
End If
这样的话,当新窗体关闭后,再点击按钮就不出现新窗体了
Private fm1 As form1
If fm1 Is Nothing OrElse fm1.IsDisposed Then
fm1 = New form1
fm1.Show()
End If
加上OrElse fm1.IsDisposed 的话就正常了
关闭窗体不就是销毁窗体了嘛?为什么还要判断IsDisposed ,不能只判断nothing呢?
也就是说当实例窗体关闭(点右上X关闭)后 fm1不是nothing嘛?
答:
关键在于.NET的垃圾回收机制。与C++不同,在VB.NET中将一个窗体关闭之后,并不会立即销毁它,并回收其资源,而只是打上了一个“不用”的标记(IsDisposed =True),等到垃圾回收进程运行时,这些对象才会被真正地销毁,在此之前,frm1<>Nothing。
---------------------------------------------------------------
问:
今天遇到一个困惑,我把书上215~217上的程序敲入,准备运行,但是运行后点击"从数据库获取数据按钮后",出现了"未处理的“System.Data.OleDb.OleDbException”类型的异常出现在 system.data.dll 中。
"的错误提示.此时程序执行到da.fill(dt)这一行.
请金老师百忙之中抽空看一下.
另外,程序中" da.SelectCommand = comm"不是很理解. 为什么不是 da.SelectCommand = comm.commandtext呢?
答:
有非常多的错误会引发这个异常,常见的原因是SQL命令的格式有误。
另外,OleDbDataAdapter的SelectCommand属性接收一个OleDbCommand类型的对象,此对象用于从数据库中提取数据。
第七章中有详细说明,请参看7.4节。
----------------------------------------------------------
问:
您好,我是一位江苏无锡的读者,对您的著作甚是喜欢,但是其中也有不明白的地方,请指教:
P130页 “两个SUB过程,为什么传值后tempobj与obj指向的对象还是同一个,而引用后就不同了。”
看了您作出的解释但是不是很明白,能否请您在百忙之中再给我详细解释一下呢?
答:
对象变量其实可以看成是一个整数变量,只不过它存放的“整数”很特殊,是内存地址值。
dim obj as new RefVal
这句执行后,在内存中创建了一个“大”的区域,用于存放以类RefVal为模板创建的对象(一个类可以创建任意多个对象)数据,存放这些数据的第一个内存单元的地址被放到变量obj中(如果把内存单元看成是小屋子,则内存地址可以看成是门牌号),假设其为ABCD。
所以,Obj.i=100的含义是到地址为ABCD的内存单元处开始寻址并找到变量i的区域,将其改为100.
当obj作为参数被传送到Sub ChangeObjByVal()中时,一个隐含的整数对象被创建,其值与obj相同,也为ABCD.
这样,在Sub过程内部使用的Obj其实与Sub过程外的Obj是两个独立的整数对象。只不过其值相同,都代表着真正的RefVal对象数据的首地址。
但在这个过程中,RefVal对象本身并没有被复制一份,被复制的只不过是它的首地址数据(如ABCD)罢了。
在Sub ChangeObjByRef()中,与上不同之处在于在Sub ChangeObjByRef过程内使用的obj变量与过程外的是同一个,不存在地址值的复制问题。是否会将参数复制一份,这就是ByRef与ByVal的区别所在。
呵呵,希望我讲清楚了。请再回头看看P84页的相关内容。
再问:
但是 Sub ChangeObjByVal()中 "obj=new refval"这句话不是又重新初始化了实例啊
这时obj.i=0啊,难道 这个obj和sub外的obj不是同一个?
再答:
凡是以ByVal方式传送的参数都被复制了一份。所以,在Sub ChangeObjByVal()中的obj和Sub外部的obj不是一个。
obj=new refval"这句话确实重新初始化了实例,但它的修改不影响Sub外的obj变量。
2月25日 更新
问:读这本书要求有哪些基础
我主要是针对大学低年级学生的知识结构来组织材料的,对读者知识水平的最低要求是高中毕业。如果是在校大学生,并且是计算机及相关专业的,则最合适不过。书中涉及到了一些数学知识,超过了高中数学的范畴,跳过就行了,不影响书的学习。
问:书的定价是否过高?
许多经济不宽裕的读者来邮件抱怨书价过高,但书价是由出版社定的,作者无能为力。一名山东的读者来邮件说他省下了一星期的早餐买下了这本书,我很感动,但身体是革命的本钱,还是要注意保重健康的。学习软件开发是需要有一定的物质保障的,如果您没有上机的机会,那么,这本书所介绍的许多东西是难以掌握的。在写作时,我是假设读者能有一台用于开发实践的电脑的,如果能上网就更好了。如果个人经济条件不具备,我想还是从现实出发,先考虑如何立足自己的实际,把生活过好来,学习软件技术未免有点脱离现实了。
问:为何不用C#作例子?
主要原因就是我一直使用VB.NET开发,因此,积累的代码实例是VB.NET的,实在没有时间将其转化为C#。而且本书主要强调的是编程的思想、方法与相关的计算机理论,语言不是重点,读者可以按照本书介绍的次序去自学C#,一样是没问题的。
问:哪儿有卖这本书?
主要是大中城市的科技书店,小城市与县城书店恐怕不会进这本书,这些地方的读者可以通过网上书店订购,或者直接联系电子工业出版社博文视点公司看看能不能邮购。
问:老师能不能指导我学习软件技术?
很多读者要求我能指点指点。如果您在北京,我每个学期都在北京理工大学开设.NET选修课,可以直接到学校来听课(开放的)。外地读者如果有困惑,可以发邮件,问得多的问题我统一在这个BLOG上回复,另外,我也只是半桶水,说的话仅是个人观点,很害怕“误人子弟”,如果观点有错误,也请大家原谅。由于收到的邮件较多,可能不一定回复,在此也敬请读者谅解。
问:买到你的书了,感觉前几章有些凌乱,把人的脑子搞的乱乱的,有东一鎯头西一棒子的感觉,并不是围绕着一个例子从头到尾的叫,让人很别扭呀,不好意思,我有话直说啦.
请回头再仔细看看《自序》中对全书结构的说明。软件本就是一个“集成”的产物,一个程序其实是多种技术的组合,各种具体的知识点相当于七巧板中的七个构造块,并无主从关系,而程序本身就相当于用七巧板拼出的图案,整个关键在于七巧板模块间组合的方式。所以我才采用这样的组织方式写书。