前 言
从开始学习和使用计算机程序语言以来,我一直是一个忠实的C++爱好者。但如今我和其他很多新老程序员们一样被C#深深吸引,原因何在?要讨论这个问题还需要从头说起。大部分人,包括我,在开始学习程序语言时都会按照自己的想法和兴趣去学习,比如C太过经典,要学习它;C++可以做游戏,有趣,学习它;VB可以快速的开发,半天时间就能折腾出个管理系统什么的,学习它;Java程序员的薪水一直以来都很可观哦,牛啊,学习它……现在的问题是每一门语言你可能都要花很长的时间去学习,而且如果你没有开发项目的经验那么你始终掌握不了这门语言的精髓。另外,更重要的是,如果你是这门程序语言的初学者,那么你对即将要展开学习的这门语言很难有一个全面而正确的认识。
作为一名程序设计技术的工程人员和培训教师,我始终在考虑关于如何学习程序语言的问题。如今的程序设计技术已是遍地开花,你想精通其中任何一个领域的技术都要花费几年甚至更长的时间。记得C++程序领域一直有这样一种说法,如果一个人搞过几年C++就声称自己精通C++,那么此人一定对C++还没有入门,因为即使有十年、二十年使用经验的人也不敢说自己精通C++,这是一门没有“顶”的语言。所以说,不要随随便便去学习一门新的程序设计语言,这是浪费时间的举动。这涉及到学习一门语言的出发点的问题,在选择学习一门新语言时,应该以经济利益和实际需要为出发点,而不是以自己的爱好和兴趣为出发点。
你可能对这个观点嗤之以鼻,我们不妨举个例子。假如在五百年前,你去习武,成为了一个武林高手,那么你会生活得很好;但在现在这个社会呢,你练了十年八年猴拳,你能干嘛?去当保镖,还是去打家劫舍落草为寇?这些似乎都不是很理想的职业。21世纪是需要人才,但已不太需要武林高手这样的人才。况且,当今的中国还是发展中国家,我们只是基本实现了小康,还没有过上物质极大丰富的生活,如果你花大量人力、物力来学习的东西最后变得毫无价值,不能给你带来经济上的利益和生活的改善,那么可以认为你做了毫无意义的事情。所以说学习程序语言意义重大,需要有选择的去学习。
程序语言就是一个工具,像其他很多工具一样,它是可以帮助我们创造价值的工具。一个工具的意义不在于它多有趣以及难度有多高,而在于它是否能创造价值。如果你操纵过工业流水线,你会发现制造一部手机并不比拿锤子做一把椅子更困难,但工业流水线比锤子有价值得多。同样,一门程序语言并不会因为它简单易懂而变得没有价值,关键在于它是否能创造价值。C#和Java相比C++来说都是操作相对简单的语言,但这并不能说明它们差,恰恰相反,它们更优秀,因为它们可以创造更多的价值。
这里要注意的是,我们通常所说的学习C#、掌握C++都不是指学习和掌握这门程序语言本身,而是指学习和掌握这门语言及这门语言背后的开发技术。而对于任何一门语言来说,它背后的知识都浩如烟海。以C++为例,据不完全统计,它已经在几百个领域有所作为,我们熟悉的领域有视频、游戏、科学计算、网络软件、操作系统、设备驱动程序、移动电话等,至于火星机器人智能驱动系统、导弹火控系统等都是常人所不能接触到的领域。通常每一个领域都需要相应的语言库或说技术来支持,比如,使用C++处理视频,你需要学习DirectShow或VFW,使用C++开发游戏你需要熟悉DirectX或OpenGL,使用C++开发驱动程序你得了解PCI总线协议以及DDK等。无论是DriectShow还是OpenGL,你花个一两年也只能算入门。这说明了一个问题,对于一门程序语言的知识,如果要想全部去掌握和学习是不可能的,我们只能有选择的且按照科学的顺序去学习。
C#语言是一门诞生不久的语言,在语法方面它兼顾了Java和C++的特点,在应用方面它吸收了VB、Java及C++的优点。它出生在微软这个豪门中,它的使命是让复杂的Java应用变得简单,使困难的C++应用变得容易,它势必成为平台和Web开发的新宠儿。正如我们所说,一门程序语言是否重要要看它能否带来巨大的价值,C#的价值似乎毫无争议,使用它你可以最快速地完成图书管理系统、人事管理系统、资产管理系统等信息系统,使用它你可以轻松地完成企业网站、电子商务等应用。从微软的白皮书来看,C#语言似乎已经无所不能,从普通的桌面和Web应用,到视频、游戏、科学计算等它都可以出色地完成。这一切都是你选择学习和使用C#的理由,因为一旦选择了C#就好比获得了一把尚方宝剑,人鬼妖魔它一切通杀。
同样,C#语言所包含的技术也是繁多的,如何学习它们成为一个难题。在如今这个知识爆炸的年代,似乎学习任何知识会都成为一个难题,难在不知道如何选择要学习的东西上。事实上,一百年前清朝的洋务派已经提出了“学以致用”的思想,这个思想放在今天也是适用的。学到的东西一定要是我们能用到的东西,这样的学习才有意义。对于编程语言也一样,一定要有选择地学习你所需要的或者你将来能够使用的技术,否则就是在浪费时间。比如你花大量的时间去学习如何使用C#编写网络游戏和设备驱动就是在浪费时间,因为C#的语言特性决定了它不适合做这些应用。本书关于C#内容的选择正是以“学以致用”为出发点来选择的,内容包括了在普通商业软件开发中需要的知识,而不是C#的所有知识。
另外,本书是按3W1H的思想来编写的。3W1H即What(是什么)、Why(为什么)、Where(用在哪里)、How(怎样用)。这个思想本来是我们这些IT培训讲师授课的思路,但我发现这也是一本好的书籍应该贯彻的思想。即本书在介绍所有知识点时,都会按照它是什么、为什么它是什么、该知识在实际开发中用在哪里及怎样使用的顺序来讲解,这样就有助于阅读的人全面、真正地获得知识。
3W1H中前两个比较容易实现,但后两个却很难做到,现实生活中也是这样。我以前认识一个快速切菜器的推销员,这个推销员时常在附近的超市门口推销它的快速切菜器。有意思的是,在他背后的超市里也有这种切菜器卖,而且价格还比他的便宜。奇怪的现象发生了,我发现超市里的切菜器根本没人买,而购买他商品的人却络绎不绝。问题出在哪里,难道是因为这个推销员特别能“忽悠”?不是!原因就在于推销员是一边演示他的商品一边卖,而超市只是把商品放在那里。推销员的演示告诉了人们怎样使用这种新型切菜器,这就是问题的根本。如果一个人不知道怎样使用这个商品,那买回去又有何用。同样,一本书在介绍知识的时候能否告诉读者这个知识用在哪里也至关重要,一个读者如果学习到不知道如何使用的知识那就是在浪费时间。
至于C#详细的学习方法已经具体体现到了本书的每个章节里,在这里我只简单的提一下。我们知道,C#是微软公司鼓捣出来的语言,毫无疑问它会为微软的操作系统服务,因为微软的任何产品,包括游戏、数据库、开发工具都有这个任务(为Windows系列服务的义务)。也毫无疑问,VC#会取代VB、VC成为Windows操作系统桌面软件的首要开发语言,我们不敢说C#将在Web领域打败Java,但对于Windows操作系统平台开发,将没有哪门语言可以与其争锋。因此,你首先要了解C#关于桌面软件的开发知识。这些知识包括C#中的Windows Form、ADO.NET等知识。当然,学习这些知识的前提是你要掌握C#基本语法及通用操作,这部分知识包括变量、语句、类定义、字符串类、读写文件、异常操作等。
有了C#基本语法、通用操作及Windows Form等相关知识,你就可以制作相应的信息管理系统了,这些系统包括财务系统、人员管理系统、收支系统等等。在编写C#相关软件有了一定的心得体会以后,你就可以学习其线程、集合、组件等相关内容了,这些知识对于创建大中型的项目非常有帮助。此后,在对平台开发有了一定的基础后,再去学习复杂的Web开发技术你会觉得更容易上手,因为微软为桌面开发和Web开发提供了相似的开发模型。C#面向Web开发方面包括的内容有:ASP.NET、XML操作、Web服务等,这些知识可以使你创建普通的企业网站和电子商务应用。
所有这些都学完后,你就可以去了解一下怎样部署桌面程序和Web程序的相关知识了。因为软件在制作完成后还需要安装和部署才能使用,所以这一步骤也是必须的。最后,你如果想让你的项目达到可重用性、可读性等诸多“国际”标准,你还得研究一下设计模式、极限编程、单元测试、重构等开发思想和开发技术,它们会使你的代码更加精良,软件更有价值。
本书结构
本书分为三篇共三十章。
第一篇称为“门”,就是入门的意思。此篇介绍.NET Framework 3.0开发框架和C#语言的基础知识,讲解了面向对象开发思想在C#中的贯彻、基本的WinForm窗体编程模型、文件读写技术和注册表操作,使读者在学习完本篇之后能够使用WinForm进行小型的应用开发。
第二篇称为“质”,涉及C#中用处最大难度最高的一些知识,包含了C#语言相关的高级概念,如集合对象、泛型、程序集、多线程等等,重点讲述了VC#中数据处理的相关技术,如ADO.NET编程、数据集、数据绑定、DataGridView控件、打印和报表等,同时,对面向对象的分析与设计、组件技术、三层架构,以及最新的WWF(工作流)都作了深入浅出的讲解和应用示范。
第三篇称为“道”,包括Web技术等相关内容,是C#中最具特色的部分。此篇介绍了C#点对点通讯编程、Internet访问,重点讲述了Web开发的相关模型,包括ASP.NET Web开发、ASP.NET Ajax、Web服务等,并引入最新的面向服务编程模型WCF和面向描述编程模型WPF,讲解了它们的概念和实际运用,同时,对与实际项目开发密切相关的安装与部署技术、单元测试和重构技术,以及代码的加密和混淆技术都作了讲解,使读者能够了解企业级的网络应用的设计与开发。
每篇分十章,以递进的方式安排内容,在前面的章节中不会出现后面章节的知识,这样有助于阅读,因此也建议读者在阅读时从头开始阅读。
三篇共三十章基本囊括了C#企业开发用到的所有知识,详细解释如下:
第1章:详细介绍.NET 3.0平台的相关概念,使读者对.NET平台的运行机制有一个初步的了解。
第2章:讲解C#语言的基本语言元素,包括变量、运算符、语句等内容。
第3章:此章开始介绍面向对象概念,讲解C#中类的定义和使用等相关知识。
第4章:讲解C#面向对象设计中的继承、抽象、接口等高级概念。
第5章:讲解C#中的委托、事件、枚举、分布类及类型转换等概念。
第6章:讲解C#中的Windows Form相关概念及其常用控件。
第7章:深入C# Windows Form GDI+、Control类等相关概念,并讲解一些复杂控件的使用。
第8章:讲解C#异常处理相关的内容。
第9章:初步讲解存储的概念,包括文件操作和文件读写等内容。
第10章:基于前9章知识的项目案例——图书收藏系统。
前十章为第1篇,掌握后可以进行普通桌面级软件的开发。我们知道,一个普通的桌面软件包括界面和简单的存储功能。以Windows歌曲播放器为例,需要一个播放音乐的界面,还需要有歌曲列表的简单存储功能。对于C#桌面软件来讲,界面可采用Windows Form来实现,数据保存功能采用文件来实现,如此一来,第一篇的知识已足够构建一个简单的小型C#应用软件了。
我们再来看第二篇的内容:
第11章:讲解重要的C#集合框架,包括常用集合类及集合接口。
第12章:讲解C#泛型相关的技术。
第13章:讲解C#多线程操作的相关内容。
第14章:本章讲解访问数据库的相关技术,包括ADO.NET、数据集等概念。
第15章:讲解数据绑定及C#特色数据控件——DataGridView控件的操作。
第16章:讲解如何使用C#实现打印和报表等功能。
第17章:本章讲解组件技术,包括程序集、反射、平台调用等技术。
第18章:本章讲解软件三层架构和软件开发方式等方面的内容。
第19章:讲解最新的工作流(WWF)开发方面的技术。
第20章:基于前面知识的项目案例——黑木崖家庭财务管理系统。
第2篇以桌面软件开发为基础讲解了C#编程知识中的一些高级概念。这些概念并不一定在每个项目中都会用到,但对于企业级软件开发来说却都很重要。这些概念都是以桌面软件开发技术为基础进行讲解的,这样做一方面可以增进读者对桌面软件开发技术的掌握,一方面也可以更直观的阐述这些知识。如前所述,.NET平台为Web开发和Windows开发提供了相似的开发模型,所以本篇所介绍的内容也同样适合于后面的Web开发。比如集合、线程、数据集、打印、报表、三层架构等所有内容都同样适合于后面的Web开发。
第三篇也是最后一篇,内容如下:
第21章:讲解C#网络通讯编程,包括基于协议的点对点通讯和基于Intenet的通讯等。
第22章:讲解XML语法及XML文档读写操作相关的知识。
第23章:初步讲解C# Web编程,包括HTML初步、ASP.NET入门等内容。
第24章:ASP.NET编程进阶,深入讲解ASP.NET相关技术。
第25章:讲解传说中的Web服务的相关技术。
第26章:讲解.NET Framework 3.0重量级组件——WPF(Windows描述基础)。
第27章:讲解WCF通讯服务及AJAX技术。
第28章:讲解项目安装及部署等相关的内容。
第29章:讲解单元测试和重构等方面的技术。
第30章:使用ASP.NET完成的项目案例——天天购物商城。
后十章也就是第三篇,内容比较杂,但都是关于网络开发的相关知识。网络开发包括点对点通信和Web开发两种模型的内容。在本书中我们以Web开发为主,之所以在第21章也介绍了点对点通信的相关技术,那只是为了能够让你更进一步的了解C# Web编程模型。我们知道将来的软件将越来越向Web应用靠拢,因此第三篇的很多知识内容都很有意义,比如Web服务、WPF、AJAX等技术现在还处于发展阶段,现在以及将来的意义都非常重大。
最后值得一提的是,本书还包括附录和多媒体配书光盘一张。附录部分位于本书的最后,内容包括C#编程规范和Visual Studio IDE操作快捷键等。多媒体光盘里面包含本书的近500个源代码示例以及几个视频教材,可以帮助你更快速地体验和理解书中的程序。如果你需要当面咨询或者下载其他的示例及视频,可以登录本书的技术网站“www.pandaos.com”,在这里面你可以获得更多的技术支持。
致谢
首先要感谢清华大学出版社的陈冰编辑,没有他本书不可能出版。这本书是他策划的“第一步”系列图书中的一本。我很喜欢“第一步”这个名字,从人类直立行走迈出人类进化的第一步,到人类踏上月球开始人类征服宇宙的第一步,都展示了第一步的重大意义。正所谓万事开头难,正确地踏入某门程序语言设计的第一步也同样具有至关重要的意义。另外,陈冰是一个很细心的编辑,他帮我扫清了书中的很多错误,甚至一些细微之处。
除此之外,我要感谢我的同事和学生,他们对本书提出了宝贵的意见,他们是甘文冰、马晓欢、夏小兵老师,以及T03、T04、T07班的学生。特别是我的学生,在我创作本书的一年时间里因为时间大量被写作占用,因此在教学方面出现了不少失误,在此感谢他们的谅解和支持,如今他们大部分已经在软件企业就业,祝愿他们在新的工作岗位上工作顺利、事业有成。
最后要感谢我的女朋友贺贞,在我写书的这段日子里,她基本上成了我的健康和生活顾问,感谢她对我的理解和支持。最后要感谢我的其他朋友们,有了他们我的生活才会变得丰富多彩,创造更有动力。他们是黄波、车小婵、郝洪梅、姜晨、何娟、邓桂梅、姚本俊、欧雅倩、刘俊菊、苏冬梅、李瑶、周韵昀、季晓林、兰泽林、贺晨曦等。
现在,书已经在你的手中打开,是时候读书了。
周 礼
2008年1月1日于深圳