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

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

相关文章

揭秘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. 不同操作

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1