
本书共分三篇,每篇十章,共三十章,兼顾理论和实际应用。三篇承上启下地讲解了VC#的开发技术和应用技巧。
第一篇介绍.NET Framework 3.0开发框架和C#语言的基础知识,透彻地讲解了面向对象开发思想在C#中的贯彻、基本的WinForm窗体编程模型、文件读写技术和注册表操作,使读者在学习完本篇之后能够使用WinForm进行小型的应用开发。
第二篇包含了C#语言相关的高级概念,如集合对象、泛型、程序集、多线程等等,重点讲述了VC#中数据处理的相关技术,如ADO.NET编程、数据集、数据绑定、DataGridView控件、打印和报表等,同时,对面向对象的分析与设计、组件技术、三层架构,以及最新的WWF(工作流)都作了深入浅出的讲解和应用示范。
第三篇主要关注网络方面的知识,介绍了C#点对点通讯编程、Internet访问,重点讲述了Web开发的相关模型,包括ASP.NET Web开发、ASP.NET Ajax、Web服务等,并引入最新的面向服务编程模型WCF和面向描述编程模型WPF,讲解了它们的概念和实际运用,同时,对与实际项目开发密切相关的安装与部署技术、单元测试和重构技术,以及代码的加密和混淆技术都作了讲解,使读者能够了解企业级网络应用的设计与开发。
本书在讲解具体的知识点时均采用直观短小的实例进行讲述,对书中的难点和疑点均采用相关的生活案例或图形图像来描述,使读者更容易掌握其技术的本质。在讲透具体的技术点后,则会给出项目级的实例来展示这些技术在实际中的运用,使读者能够对相关的企业级开发做到融会贯通。
本书适用于C#和.NET初学者、开发者和讲授C#和.NET的教师,也可作为大学及计算机培训班的C#和.NET课程教材。
前 言
从开始学习和使用计算机程序语言以来,我一直是一个忠实的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日于深圳
目 录
第一篇 门
第1章 进入Microsoft .NET世界 2
1.1 Microsoft .NET的理念 2
1.1.1 Visual Studio .NET的历史和延承 3
1.1.2 初识 .NET Framework 4
1.2 .NET Framework的架构 5
1.2.1 什么是公共语言运行时(CLR) 5
1.2.2 微软中间语言——MSIL 6
1.2.3 .NET框架中的编程语言 7
1.2.4 多语言支持和语言互操作的基础——CTS和CLS 7
1.2.5 了解.NET类库 8
1.3 开发环境的安装 9
1.3.1 Visual Studio的安装 10
1.3.2 安装.NET Framework 3.0环境 11
1.3.3 关于Visual Studio 2007及Visual Studio 2008 14
1.4 开始我们的应用程序 15
1.4.1 你的第一个C#程序 15
1.4.2 Visual Studio 2005介绍 17
1.4.3 帮助文档的使用 23
1.5 小结 25
第2章 C#语言基础 26
2.1 学习数据类型 26
2.1.1 变量的概念 26
2.1.2 值类型 28
2.1.3 引用类型 32
2.2 运算符和表达式 33
2.2.1 算术运算符 33
2.2.2 关系运算符 35
2.2.3 逻辑运算符 36
2.2.4 赋值运算符 38
2.2.5 移位运算符 39
2.2.6 运算符的优先级 40
2.3 掌握语句 42
2.3.1 分支结构语句 43
2.3.2 循环语句 48
2.3.3 跳转语句 55
2.4 你必须了解的细节 58
2.4.1 数组 58
2.4.2 变量的作用域 61
2.4.3 类型转换 63
2.4.4 代码注释和#region指令 65
2.5 小结 66
第3章 C#中的面向对象 67
3.1 类的定义 68
3.1.1 什么叫字段 70
3.1.2 方法又是什么 71
3.2 类的使用——以鸭子为例 74
3.2.1 类成员的访问 76
3.2.2 类和对象的关系 77
3.3 类的数据成员的存放问题 78
3.3.1 类成员的存放 78
3.3.2 有点特别的静态数据成员 79
3.4 关于方法成员的更多研究 80
3.4.1 静态方法 80
3.4.2 方法重载及其意义所在 81
3.4.3 构造方法——初始化类中的数据成员 83
3.4.4 析构方法——销毁对象回收资源 84
3.5 属性和索引器的作用 86
3.5.1 属性 86
3.5.2 索引器 90
3.6 小结 94
第4章 面向对象的高级概念 95
4.1 继承 95
4.1.1 创建和使用继承 96
4.1.2 基对象引用子类实例——父母可以代表孩子做很多事情 100
4.1.3 base关键字 102
4.1.4 this关键字——用来调用本类成员 105
4.2 抽象类 106
4.2.1 何谓抽象和抽象类 107
4.2.2 实现抽象类 108
4.3 接口——多继承的换代产品 112
4.3.1 接口的定义和实现 112
4.3.2 显式接口实现——解决接口继承时的同名方法冲突 117
4.3.3 接口的使用 119
4.4 会飞的鸭子 120
4.4.1 定义鸭子类 120
4.4.2 使用继承 121
4.4.3 抽象类的作用 122
4.4.4 接口的好处 124
4.5 小结 126
第5章 高级类型 127
5.1 委托 127
5.1.1 委托的概念 127
5.1.2 委托的秘密 130
5.1.3 多播委托——引发连锁反应 130
5.2 事件 133
5.2.1 事件机制的原理 133
5.2.2 警察抓小偷 135
5.3 其他类型 137
5.3.1 枚举 137
5.3.2 结构——C语言的遗产 140
5.3.3 密封类——不能被继承的类 141
5.3.4 分部类——解决超长类代码的存放 142
5.3.5 匿名方法 143
5.3.6 可空类型 144
5.3.7 命名空间——区别同名类 145
5.3.8 数学类 146
5.3.9 日期类型 147
5.3.10 随机数类 148
5.3.11 字符串类 150
5.4 类型运算 155
5.4.1 类型转换 155
5.4.2 is运算符——检查某个对象是否与给定类型兼容 159
5.4.3 as运算符 160
5.4.4 溢出检查的启用和取消——checked和unchecked 160
5.4.5 out和ref 161
5.4.6 typeof运算符 161
5.5 小结 162
第6章 Windows窗体编程 163
6.1 第一个窗体程序 163
6.1.1 建立第一个窗体程序 164
6.1.2 窗体代码分析 166
6.1.3 窗体事件机制 168
6.2 基本窗体控件 169
6.2.1 按钮(Button)控件 170
6.2.2 多选框(CheckBox)控件 170
6.2.3 单选按钮(RadioButton)控件 171
6.2.4 标签(Label)控件 171
6.2.5 文本框(TextBox)控件 172
6.2.6 组合框(ComboBox)控件 174
6.2.7 一个小例子——IT技术调查 175
6.3 其他常用控件 176
6.3.1 滚动条(ScrollBar)和进度条(ProgressBar) 176
6.3.2 列表框(ListBox)控件 177
6.3.3 工具栏(ToolStrip)控件 178
6.3.4 状态栏(StatusStrip)控件 179
6.3.5 列表视图(ListView)控件 180
6.3.6 树视图(TreeView)控件 182
6.4 小结 185
第7章 窗体控件编程 186
7.1 高级控件 186
7.1.1 创建菜单 186
7.1.2 多文档应用程序 189
7.1.3 容器控件 191
7.1.4 对话框控件 192
7.2 GDI+的原理 193
7.2.1 画直线和曲线 195
7.2.2 绘制填充区域——使用刷子类 197
7.2.3 绘制图像——使用Image类 199
7.2.4 绘制文字——小例子:枚举系统支持的所有字体 200
7.3 窗体事件处理模型的基础——消息机制 202
7.3.1 Windows消息机制 203
7.3.2 重要的Control类 206
7.4 小结 209
第8章 处理异常 210
8.1 异常的产生——Bad Smell导致的问题 210
8.1.1 代码的错误有哪些 211
8.1.2 如何发现错误 213
8.2 使用调试器 214
8.2.1 断点管理窗口 215
8.2.2 自动窗口 216
8.2.3 监视窗口 217
8.2.4 即时窗口 217
8.2.5 使用调试器——一次程序调试实战 218
8.3 为程序买份保险 220
8.3.1 结构化异常处理 222
8.3.2 异常类和异常家族 223
8.3.3 多重catch语句 224
8.3.4 嵌套异常结构 226
8.4 自定义异常 228
8.4.1 使用自定义异常 228
8.4.2 如何正确使用异常 229
8.5 小结 230
第9章 操作文件和注册表 231
9.1 了解和操作注册表 231
9.1.1 了解注册表 232
9.1.2 操作注册表并编写一个简单的注册表编辑器 233
9.2 文件和文件夹操作 237
9.2.1 文件操作类及其使用 238
9.2.2 文件夹操作类及其使用 241
9.3 读写文件 243
9.3.1 流的概念——流就是“牛” 243
9.3.2 文件读写的方法 245
9.3.3 编码方式 245
9.3.4 文件流操作 247
9.3.4.1 一个Hello World级的文件流操作例子 249
9.3.4.2 创建一个简单的Windows记事本 250
9.3.5 读写文本数据及用流读写器重写文件流读写文件的例子 251
9.4 小结 254
第10章 案例——书籍收藏系统 255
10.1 项目背景 255
10.1.1 项目描述 255
10.1.2 软件的生命周期 255
10.1.2.1 了解软件生命周期的五个阶段 256
10.1.2.2 关于软件质量的几点做法 257
10.1.3 功能的组成 258
10.2 功能的实现 259
10.2.1 界面设计 259
10.2.2 代码实现 263
10.3 小结 271
第二篇 质
第11章 集合对象 273
11.1 数组 273
11.1.1 认识Array类 273
11.1.2 使用Array类 274
11.2 动态数组 276
11.2.1 认识ArrayList类 277
11.2.2 操作ArrayList 278
11.2.3 使用ArrayList缓存数据——一个简单的学员管理系统 280
11.3 哈希表 283
11.3.1 认识Hashtable类 284
11.3.2 Hashtable的操作 284
11.3.3 使用嵌套Hashtable——创建一个电话本系统 287
11.4 集合空间的接口 290
11.4.1 Icollection接口 291
11.4.2 Ienumerable接口及其使用 291
11.4.3 Ilist接口 293
11.4.4 自定义集合类 294
11.5 专用集合类 297
11.5.1 栈Stack 298
11.5.2 队列Queue 299
11.5.3 SortedList集合 300
11.5.4 更方便的操作字符串集合——StringCollection和StringDictionary集合 302
11.6 小结 303
第12章 泛型 304
12.1 为什么使用泛型 304
12.1.1 泛型思想的引出 304
12.1.2 C#泛型简介 306
12.2 泛型定义及其应用 307
12.2.1 泛型结构体 308
12.2.2 泛型类 309
12.2.3 泛型接口 311
12.2.4 泛型委托 312
12.2.5 泛型约束 314
12.3 泛型集合 315
12.3.1 泛型List集合 316
12.3.2 泛型哈希表——Dictionary 317
12.3.3 泛型队列 319
12.3.4 泛型栈 320
12.4 泛型的应用 321
12.4.1 使用泛型要注意的问题 321
12.4.2 一个泛型使用的示例 323
12.5 小结 326
第13章 多线程 327
13.1 进程与线程的概念 327
13.2 使用线程 329
13.2.1 认识Thread类并创建你的第一个带线程的程序 329
13.2.2 线程的方法和状态 332
13.2.3 线程的优先级及实用实例 334
13.3 线程的同步 336
13.3.1 锁定机制——使用Lock关键字 338
13.3.2 最常用的同步基元——监视器 340
13.3.3 事件 343
13.3.3.1 一个体现通知机制的例子 343
13.3.3.2 用三条线程去分别得到房子、车子和妻子 345
13.3.4 理解线程池——外加一个Word模拟程序 346
13.4 多线程应用 348
13.4.1 何时使用线程 349
13.4.2 集合中的线程安全 349
13.4.3 使用线程操作Windows窗体 352
13.4.3.1 采用计时器来设计一个闹钟程序 352
13.4.3.2 使用线程来实现闹钟功能 353
13.4.4 一个线程的例子——福利彩票双色球 356
13.5 小结 359
第14章 ADO.NET编程 361
14.1 数据库基础 361
14.1.1 SQL Server 2005的安装与使用 361
14.1.2 SQL简介 364
14.1.3 创建数据库 366
14.1.4 创建表 368
14.1.5 如何对数据进行增、删、改 370
14.1.6 如何查询数据 371
14.1.7 更快的执行速度——存储过程 374
14.1.8 数据库管理的基本操作 375
14.2 ADO.NET简介 376
14.2.1 ADO.NET的组成部件 377
14.2.2 ADO.NET的新特性 378
14.3 连接式访问数据库 379
14.3.1 如何连接数据库 380
14.3.2 如何操作数据库增、删、改、查 382
14.3.3 读取数据库结果集 386
14.3.4 事务操作的原理及其使用 387
14.4 调用存储过程 389
14.4.1 参数对象 390
14.4.2 调用无返回值的存储过程 392
14.4.3 调用带返回值的存储过程 394
14.5 数据集 396
14.5.1 认识数据集 397
14.5.2 建立数据表 397
14.5.3 数据集综合操作 401
14.6 断开式操作数据库 404
14.6.1 认识数据适配器 405
14.6.2 填充数据集 406
14.6.3 把数据集中的数据同步到数据库 408
14.7 小结 415
第15章 数据绑定 416
15.1 更强大的数据呈现——使用DataGridView控件 416
15.1.1 DataGridView的属性和方法 417
15.1.2 将DataGridView绑定到数据集 417
15.1.3 将DataGridView绑定到数据视图 420
15.1.4 将DataGridView绑定到数组 422
15.1.5 将DataGridView绑定到集合 423
15.1.6 定制DataGridView控件 423
15.2 数据集与数据绑定 427
15.2.1 提高代码的可读性——类型化数据集 427
15.2.2 BindingSource组件的优势 430
15.2.3 绑定DataGridView控件 431
15.3 绑定的应用 435
15.3.1 绑定到文本框 435
15.3.2 绑定到组合框 437
15.3.3 示例——一个简单的人事管理系统 438
15.4 小结 443
第16章 打印和报表 444
16.1 为你的程序添加打印功能 444
16.1.1 打印的原理与实现 444
16.1.2 认识打印控件——创建一个带打印功能的程序 447
16.1.3 打印DataGridView数据 449
16.2 水晶报表 450
16.2.1 快速建立水晶报表——创建一个家庭财务开支系统 451
16.2.2 报表查看器控件 457
16.2.3 报表文档 458
16.2.4 专业的报表设计器——水晶报表专家 460
16.2.5 加载和使用水晶报表 461
16.2.6 筛选报表数据 463
16.3 小结 465
第17章 组件技术 466
17.1 搭积木游戏 466
17.1.1 应用程序交互的发展史 466
17.1.2 组件的概念 468
17.2 认识程序集 468
17.2.1 弱名称和强名称程序集的区别 469
17.2.2 如何建立和使用程序集 470
17.3 反射技术 476
17.3.1 反射的概念 476
17.3.2 使用反射访问程序集 476
17.4 天下皆积木——平台调用 480
17.4.1 特性的概念 480
17.4.2 如何调用Windows API 481
17.4.3 如何调用COM组件 482
17.5 小结 485
第18章 软件开发方式 486
18.1 面向对象的分析与设计 486
18.1.1 OOAD的必要性 487
18.1.2 软件的组成“材料” 487
18.1.3 面向对象分析 489
18.1.4 面向对象设计 490
18.1.5 掌握VS .NET的类图设计器的使用 491
18.2 软件的体系结构 495
18.2.1 软件体系中的内容 495
18.2.2 组件 496
18.2.3 模式 496
18.2.3.1 设计模式——一个应用单例模式的例子 497
18.2.3.2 一个工厂模式的例子 498
18.2.4 软件的设计原则 500
18.3 .NET的三层架构 500
18.3.1 三层架构的构成 501
18.3.2 为什么要使用三层架构 503
18.3.3 一个应用三层架构的示例——家庭理财系统 503
18.3.3.1 建立数据库 503
18.3.3.2 小试三层架构 505
18.3.3.3 实现界面层 512
18.3.3.4 实现业务层 514
18.3.3.5 实现数据层 515
18.3.3.6 完成项目 518
18.4 小结 519
第19章 Windows工作流基础(WWF) 520
19.1 工作流的基础 520
19.1.1 你的第一个工作流程序 520
19.1.2 理解宿主的概念 525
19.1.3 理解活动(Activity)的概念 525
19.2 顺序工作流 527
19.2.1 顺序工作流控件 527
19.2.2 建立顺序工作流 529
19.3 状态工作流 532
19.3.1 状态工作流控件 532
19.3.2 建立状态机工作流——实现一个红绿灯系统 534
19.4 工作流的应用 538
19.4.1 向工作流传入数据 538
19.4.2 让工作流调用外部方法 540
19.4.3 使用事件控制工作流 543
19.5 实现更现实的工作流——订单处理流程 547
19.5.1 订单处理业务 547
19.5.2 建立订单状态工作流 548
19.5.3 应用工作流组件 552
19.5.4 工作流应用领域 558
19.6 小结 558
第20章 案例——黑木崖家庭财务系统 559
20.1 需求分析 559
20.1.1 项目名称及背景 559
20.1.2 需求规定 559
20.1.3 运行环境规定 561
20.2 系统设计 561
20.2.1 应用三层架构 561
20.2.2 数据库设计 562
20.2.3 界面设计 567
20.3 功能实现 569
20.3.1 账户管理模块 570
20.3.2 账薄管理模块 577
20.3.3 财务中心模块 588
20.3.4 系统中心模块 590
20.4 小结 592
第三篇 道
第21章 网络编程 594
21.1 网络编程基础 594
21.1.1 网络通信基础 594
21.1.2 System.Net命名空间概述 596
21.2 网络通讯编程 596
21.2.1 TCPClient和TCPListener类的使用——编写一个点对点聊天工具 597
21.2.2 使用UDPClient——无连接的发送数据方式 599
21.2.3 实现一个P2P聊天室 601
21.3 访问Internet 609
21.3.1 用WebClient访问Internet——实现下载和上传文件的例子 609
21.3.2 WebRequest 类和WebResponse类及其使用 611
21.3.3 使用浏览器控件——制作一个简单的浏览器 612
21.4 小结 615
第22章 XML 616
22.1 XML简介 616
22.1.1 XML的由来 616
22.1.2 XML的组成 617
22.1.3 什么时候使用XML 618
22.2 XML的语法 619
22.2.1 构成元素——剖析一个基本的XML文档 619
22.2.2 XML语法要点 620
22.2.3 CDATA语法 621
22.2.4 命名空间 622
22.2.5 什么是实体 624
22.2.6 架构(Schamer)——XML文档的验证 625
22.2.7 Schema语法 628
22.3 XML的读写操作 630
22.3.1 XML的流式读写——一个流式读写XML的例子 630
22.3.2 XML的随机读写——几个随机读写XML的例子 635
22.3.3 编程验证XML文档的有效性 641
22.3.4 数据集与XML 642
22.4 小结 644
第23章 ASP.NET基础 645
23.1 HTML简介 645
23.1.1 标签 646
23.1.2 表单 652
23.1.3 脚本 655
23.2 进入ASP.NET的世界 657
23.2.1 ASP.NET概述 657
23.2.2 配置ASP.NET的运行环境 658
23.2.3 你的第一个ASP.NET程序 659
23.3 简单控件 663
23.3.1 Label控件 664
23.3.2 TextBox控件 664
23.3.3 CheckBox控件 664
23.3.4 RadioButton控件 664
23.3.5 Button 665
23.3.6 Image控件 665
23.3.7 DropDownList控件 667
23.3.8 Calendar控件 669
23.3.9 AdRotator控件 669
23.4 小结 670
第24章 ASP.NET进阶 671
24.1 Web对象模型 671
24.1.1 Page对象及其使用 671
24.1.2 HttpResponse、Cookie、HttpRequest对象及其使用 674
24.1.3 Application、Session对象及其使用 678
24.1.4 Server对象和PostBackUrl属性及其使用 680
24.2 数据绑定 684
24.2.1 绑定控件属性 684
24.2.2 GridView控件及其使用 685
24.2.3 DataList控件及其使用 686
24.2.4 FormView控件及其使用 688
24.3 高级Web控件 690
24.3.1 登录控件 690
24.3.2 验证控件 691
24.3.3 导航控件 692
24.3.4 WebParts控件——创建一个简单的Web部件应用 693
24.3.5 Master Pages模板页 696
24.4 小结 699
第25章 Web服务 700
25.1 大道的到来——Web服务 700
25.1.1 创建你的第一个Web服务——一个简单的令人吃惊的计算服务 701
25.1.2 相关术语 704
25.2 创建Web服务 706
25.2.1 创建Web服务 706
25.2.2 发布Web服务 708
25.3 使用Web服务 712
25.3.1 在Windows项目中使用Web服务 713
25.3.2 在Web应用中使用Web服务 716
25.3.3 Web服务示例——创建一个股票查询系统 716
25.4 小结 721
第26章 Windows描述基础(WPF) 722
26.1 新时代的开发框架WPF 722
26.1.1 WPF简介 722
26.1.2 你的第一个WPF程序 723
26.1.3 XAML概述及剖析 726
26.2 WPF基本控件 728
26.2.1 按钮控件 729
26.2.2 文本及图片控件 731
26.2.3 视图控件 732
26.2.4 容器控件 736
26.2.5 数据绑定控件 739
26.2.5.1 绑定控件属性 739
26.2.5.2 绑定XML数据源 739
26.2.5.3 绑定对象 740
26.2.5.4 绑定数据集 742
26.3 图像与多媒体 745
26.3.1 创建2D图形 745
26.3.2 创建一个简单的3D图形 747
26.3.3 创建动画——一个渐变的长方形 748
26.3.4 音视频播放——创建一个媒体播放器 749
26.4 小结 751
第27章 WCF和AJAX 752
27.1 什么是WCF 752
27.1.1 WCF技术基础 752
27.1.2 创建一个简单的WCF服务 754
27.1.3 承载和使用WCF服务 757
27.2 AJAX技术 761
27.2.1 AJAX简介 761
27.2.2 JavaScript的语法 762
27.2.3 创建并解析一个AJAX应用 767
27.2.4 使用ASP.NET AJAX组件创建AJAX应用 768
27.3 小结 772
第28章 项目的安装与部署 773
28.1 项目部署 773
28.1.1 安装部署的类型 773
28.1.2 部署桌面应用程序——创建一个桌面程序安装包 774
28.1.3 部署Web应用程序 779
28.2 保护你的知识产权——给你的程序加密 780
28.2.1 混淆器简介 781
28.2.2 使用混淆器来加密程序 783
28.3 Windows服务 787
28.3.1 创建一个Windows服务 788
28.3.2 使用应用程序配置文件 791
28.3.3 使用Windows服务来部署程序 793
28.4 小结 794
第29章 单元测试和重构 795
29.1 单元测试 795
29.1.1 单元测试的概念 795
29.1.2 使用NUnit进行单元测试 796
29.2 重构(Refactoring) 801
29.2.1 为什么要重构 802
29.2.2 何时进行重构 803
29.2.3 重构的方法 803
29.3 使用Visual C#重构菜单 808
29.3.1 提取方法 809
29.3.2 重命名 810
29.3.3 封装字段 811
29.3.4 提取接口 812
29.3.5 将局部变量提升为参数 813
29.3.6 移出参数 814
29.3.7 重新排列参数 815
29.4 小结 816
第30章 案例——天天购物商城 817
30.1 需求分析 817
30.1.1 项目名称及背景 817
30.1.2 需求规定 817
30.1.3 运行环境规定 818
30.2 系统分析 818
30.2.1 应用三层架构 819
30.2.2 数据库设计 820
30.2.3 界面设计 823
30.3 功能实现 824
30.3.1 主页面实现 825
30.3.2 购物车实现 829
30.3.3 详细信息页面 830
30.3.4 结算中心模块 834
30.4 小结 837
附录A C#语言规范 838
命名规范 839
注释规范 844
行文规范 845
附表 851
附录B 快捷键参考 854