《编程的奥秘》读者问答(时时更新)

2024-01-18 08:32

本文主要是介绍《编程的奥秘》读者问答(时时更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下将我收到的邮件中读者常问的问题进行统一回答。欢迎读者反馈各种意见。

(有关问题我会以评论的方式及时在此跟贴,时时更新)


问:

您好,金老师,我是贵书《编程的奥秘》的读者,虽然还未读完,但能感受到您对编程的热情以及对教育事业的努力,请允许我说一声“谢谢”,下边说一下我在读贵书时遇到的困惑。

环境: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上回复,另外,我也只是半桶水,说的话仅是个人观点,很害怕“误人子弟”,如果观点有错误,也请大家原谅。由于收到的邮件较多,可能不一定回复,在此也敬请读者谅解。

问:买到你的书了,感觉前几章有些凌乱,把人的脑子搞的乱乱的,有东一鎯头西一棒子的感觉,并不是围绕着一个例子从头到尾的叫,让人很别扭呀,不好意思,我有话直说啦.

请回头再仔细看看《自序》中对全书结构的说明。软件本就是一个“集成”的产物,一个程序其实是多种技术的组合,各种具体的知识点相当于七巧板中的七个构造块,并无主从关系,而程序本身就相当于用七巧板拼出的图案,整个关键在于七巧板模块间组合的方式。所以我才采用这样的组织方式写书。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=609718


这篇关于《编程的奥秘》读者问答(时时更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/618520

相关文章

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

Pandas利用主表更新子表指定列小技巧

《Pandas利用主表更新子表指定列小技巧》本文主要介绍了Pandas利用主表更新子表指定列小技巧,通过创建主表和子表的DataFrame对象,并使用映射字典进行数据关联和更新,实现了从主表到子表的同... 目录一、前言二、基本案例1. 创建主表数据2. 创建映射字典3. 创建子表数据4. 更新子表的 zb

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作