现在该不该学习Win 32 API和汇编?
——《.NET 2.0面向对象编程揭秘》勘误兼回答读者问题
本书出版以来,陆续收到了一些读者的邮件,或者探讨技术,或者指出疏漏。感谢热心而且细心的读者,你们对技术认真执著的精神很让我感动。今后,我会在本博客上给《.NET 2.0面向对象编程揭秘》提供一个勘误表,将发现的疏漏公布。
最近收到山东师范大学张超同学的邮件:
===========================
金老师:
你好,我是山东师范大学的一名大三学生,……(中间的文字与本文关系不大,略去),我现在还有个困惑想请教一下老师:现在还有没有必要再学传统的Windows程序设计(我指的是WindowsAPI编程,不知这样说合不合适),是不是.NET的出现淘汰了这个技术?另外有没有必要学习汇编语言,是不是学了编出的程序效率高一些?请金老师指点一下。
另外老师的著作《.NET2.0面向对象编程揭秘》中有两个地方好像不太完善:
一.
第259页浅复制的那段代码中的“ return obj; ”我个人认为应改为 “return newObj;”,要不然复制后的对象也指向原对象了。
二.
第253页信息的双向传送中下面这个过程有点小问题:
Private Sub ChangeProgressBarValue(ByVal IsIncrease As Boolean)
If IsIncrease Then '增值
If Me.ProgressBar1.Value = 100 Then
Me.ProgressBar1.Value = 0 '重新开始
Else
Me.ProgressBar1.Value += 2
End If
Else '减值
If Me.ProgressBar1.Value = 0 Then
Me.ProgressBar1.Value = 0 '不允许再减少了
Else
Me.ProgressBar1.Value -= 2
End If
End If
'显示信息
Me.lblInfo.Text = String.Format("{0}%", Me.ProgressBar1.Value)
'向主窗体的公有方法向其传送信息
Me.frmMainForm.SetValue(Me.ProgressBar1.Value)
End Sub
当我手工把主窗体中NumericUpDown1的值改为99后(当然这是我故意的),再单击从窗体上的“增加值”按钮会产生异常,程序的健壮性还不是很好,不过老师是为了说明信息的传递原理,可能就没太关注这个了。
==============================
我的回答:
你发现的第一个问题是我的疏漏,确实应该改为newObj;
第二个问题很好解决,将
If Me.ProgressBar1.Value = 100 Then
改为
If Me.ProgressBar1.Value >= 100 Then
即可。
有关程序健壮性的问题是比较麻烦的,因为程序实际运行时可能出现的情况太多了,拿本例来说,用户也完全可能输入的不是数字,而是字符,特别地,有可能是全角数字……。但除非作为一个商业程序,一些简单的示例可以不必考虑得过多,不这样做,细节就淹没了主题。
关于Win 32 API和汇编该不该学习的问题,我很难回答“该”还是“不该”。一切应该从学习者本人的情况出发决定。
Win32 API 有数千个C语言形式的函数,涉及到Windows操作系统的许多运行机理,花功夫学习可以对Windows操作系统有深入的了解,对写出高质量的软件有帮助。另外,至少到目前,Win32 API 仍然是调用Windows操作系统的核心功能的主要手段之一,最新的Vista仍然是NT平台的技术(其版本为6.0),这就是说,仍然在底层使用Win32 API。从这个意义上说,学Win32 API是有用的。但要注意,没有一个技术是可以长盛不衰的,win 32 API也一样,迟早会被更好的技术取代。Windows应用程序的开发日益转向使用.NET是微软坚定不移的战略,其思想是用面向对象的类来取代传统的函数,即使用面向对象的类而不是结构化编程时代的函数来调用操作系统功能。因此,如果你主要从事应用系统的开发,与操作系统底层技术细节关系不大的话,确实可以不去花大量时间对Win32 API深挖细掘。而且Windows本身源码不公开,是个“黑盒”,学习起来也不方便。
你如果因为想深入了解操作系统这一目的而学习Win32 API,建议先去学习大学计算机专业课——《操作系统》,然后,直接研究开源的LINUX是较好的选择。
再谈谈汇编。
汇编语言有许多种,目前高校中讲授的大多是PC上最早源自8086系列的汇编语言,虽然现在很少直接用汇编来写应用程序,但与Win32 API不一样,我还是建议在校学生好好学学汇编,但其目的不是为了直接写应用级别的程序,而是通过它来深入地了解计算机。
汇编本身属软件范畴,但与硬件关系密切,学习它有助于更好地了解计算机体系结构。你只要抱着“我想弄清楚计算机内部是什么样的,软件是如何控制硬件干活的”这个目的去学就行了。另外,如果你想向硬件方向发展,汇编与C语言是必须下功夫扎实掌握的硬件工程师基本功之一。
还要指出一点,汇编技术也是现代软件编译器的基础技术之一,通过分析编译器为应用程序生成的汇编代码,有助于写出高效率高质量的代码,也有助于定位程序BUG。我在写作《.NET 2.0面向对象编程揭秘》一书时,就是通过直接阅读C#编译器生成的IL源码,对CLR和面向对象技术才有了较以前仅使用面向对象语言编程时更多更深入的了解。这些心得,我都写在书中了。
总结一下:知识都是有用的,但每个人的定位不一样,发展方向也不一样,因此,没有必要什么知识都去学,也不要对各种知识和技术平均分配精力。有所不为才能有所为,要绕着自己的长处与兴趣点去分配时间和精力,要在某个最适合发挥自己长处的领域做到出类拔萃,在此基础上,对于其他领域的知识,大致了解就够了。样样都懂,却样样不精,难有成就。对于目前这种知识爆炸的现状,我认为这是唯一可取的策略。