内容简介
尊敬的读者: 本书的第1版出版于2001 年在乔治亚州亚特兰大市举办的Tech•Ed 会议之后不久。本书的最新版是以前版本的全新升级,它阐述了.NET 3.0 和.NET 3.5 中包含的所有新特性。 .NET 3.0 没有改变VB 的语法,它只是“增强版”,实际上提供了3种新的API:Windows Presentation Foundation(WPF) 、Windows Communication Foundation(WCF) 和Windows Workflow Foundation (WF) 。本书还讨论了W’s 。 有别于.NET 3.0,.NET 3.5 提供了许多新的VB 语言特性和新的.NET A P I 。本书将使用与前面版本同样通俗易懂的方法,详细介绍所有这些新内容。本书将详细讨论语言级集成查询(Language Integrated Query,LINQ) 、VB 2008 语言变更(对象初始化语法、扩展方法、匿名类型等)以及Visual Studio 2008 的许多附加功能。 本书的任务就是为VB 2008 语言和面向对象编程技术以及.NET 平台的核心问题奠定坚实基础。掌握了本书的内容之后,您就可以自如地将这些知识应用于特定的编程任务,从而根据自己的想法探索.NET 世界。 祝您学习愉快!
.NET平台刚发布时(大约是2001年)在Visual Basic编程界引起了不小的轰动。一方面,很多顽固的VB6开发人员抗议VB6和Visual Basic .NET(VB.NET)之间的区别太大。这个群体中有人惊讶地发现,VB.NET实际上不是“VB7”(即与VB6具有相同的语法和编程结构,加上一些新的功能),其中有些东西已截然不同。 事情的真相是VB.NET与VB6的关系不大,最好将它看作BASIC家族的一门新语言。这一事实使有的人极度畏缩,以致于他们给VB.NET起了“VB.NOT”或“Visual Fred”等绰号来表达他们的不满。事实上,甚至有人开发了网站,专门写了请愿书,抨击Microsoft为了VB.NET这一新生事物而放弃VB6的决策。 VB.NET不仅引入了重大的语法变化,而且有些VB6风格的行为在.NET平台下完全不见踪影,因为它只会增加混乱。数据访问、表单开发和Web站点结构的核心.NET编程模型完全不同于它们基于COM的对应物。 随着时间的推移,.NET平台成为了主流的编程模型,即便是最顽固的VB6开发人员似乎也开始动摇了:VB6很快成为遗留编程工具。甚至Microsoft本身也明确地表示会随着时间的推移逐渐停止对VB6的支持。这也许是好事,它迫使我们改变。 注意: 在发布.NET 2.0时(大约是2005年),VB.NET被重命名为“Visual Basic 2005”。在发布.NET 3.5时,Microsoft的BASIC语言又被重新命名,这次称为“Visual Basic 2008”(是的,VB重命名游戏玩得疯了)。在本书中,当看到术语Visual Basic、VB或Visual Basic 2008时,要知道它们都是指.NET平台中的BASIC语言。当指的是以COM为中心的BASIC语言时,会使用术语Visual Basic 6.0或简称为VB6。 另一方面,很多VB6开发人员也为这众多的新语言功能所激动,而且开始虚心学习。这个群体的成员已准备好深入挖掘面向对象编程(OOP)、多线程应用程序开发以及从.NET基类库中发现的大量功能的细节。这些人很快意识到,在很多(如果不是大部分)情况下,现有VB6代码可以保留VB6代码,而新的开发可以用.NET平台和Visual Basic语言的最新迭代进行。 奇怪的是还有第三群人,随着Visual Basic .NET的发布而形成。因为VB.NET实际上是一门崭新的OOP语言,所以很多从来没有想过学习以BASIC为中心的语言的开发人员(通常是C++、Java和C#程序员)现在思想更为开放,开始探索全无分号和花括号的语言了。 无论如何,不管您认同哪一种群体,都欢迎您阅读本书。本书将采用的总体方法是将VB 2008作为BASIC家族中的一个独特成员来对待。在学习了开头几章后,就会介绍VB 2008的语法和语义。这里您将发现OOP的全面基础,包括了新VB 2008的所有语言功能(如对象初始化语法、匿名类型、扩展方法和 语言集成查询),并指导如何使用Visual Studio 2008集成开发环境。 另外,本书将深入讨论构建.NET应用程序时将用到的各个主要.NET代码库。还将提供.NET桌面编程的各个架构(Windows Forms和Windows Presentation Foundation)、ADO.NET的数据库编程、用ASP.NET进行的Web开发,以及其他关键.NET主题,如程序集配置、Windows Communication Foundation、Windows Workflow Foundation和文件IO操作。 我们是一个小组,您和我 技术作者为一个小组的成员(我应当知道—— 我是他们中的一员)编写了本书。您知道用任何平台构建软件解决方案都是极其详细的,而且非常具体地针对您的部门、公司、客户群等。也许您在电子发行行业工作,为州或本地政府开发系统,或者在NASA或军事分支机构工作。就我而言,我开发了孩子的教育软件、各种n层系统,以及医药和法律行业的大量项目。很可能您在您的就业地点写的几乎100%代码都和我在我的工作地点写的代码不同(除非我们以前碰巧一起工作过)。 因此,在本书中我有意识地选择避免创建与特定行业或编程vein紧密相关的示例代码。鉴于此,我选择用与行业无关的示例来解释VB 2008、OOP、CLR和.NET基类库。我不会给每个示例填充网格数据、计算薪金或诸如此类的事,相反,我会坚持采用我们都相关的主题:汽车(它有一些几何结构,还有一些与员工有关的事情)。所以我们采用这个示例。 我的任务是解释VB 2008编程语言和.NET平台的核心方面。为此目的,当本书结束时,我将尽一切努力来为您提供继续学习所需的工具和策略。 您的任务是接受这些信息并将它应用到您的特定编程任务上。我当然知道您的项目很可能不是有关汽车和昵称的,但通过这些示例可以运用所学的知识!请放心,一旦您理解了本书中提出的概念,就可以很好地构建映射到您自己独有的编程环境的.NET解决方案。 本书读者对象 本书假设您目前不具备以BASIC为中心的语言或Microsoft的.NET平台的经验(然而,如果已经有一些经验,当然更好)。本书假定您要么是一名专业软件工程师,要么是计算机科学系的学生。因此,本书可能不是特别适合对软件开发完全陌生的人,因为我们将探索很多低级/高级主题,而且不会花很多时间来将数据绑定到网格(至少在第22章之前不会),也不会介绍Visual Studio 2008菜单项的每个选项。 尽管本书将深入讨论一些高级主题,但这并不是说这里包括的材料就是不实用的!本书着重关注您作为一名精通的Visual Basic 2008开发人员必须理解的细节。由于部分信息可能比较有挑战性(例如,理解委托和lambda表达式的作用),因此本书是以友好而平易近人的语气编写的。 本书假定您是希望了解VB 2008内部工作的开发人员,因此不会通过简单地“拖放”来编写代码。尽管本书大部分是分析如何使用Visual Basic 2008来减少您必须手动创建的代码量,但本书通常只在您理解如何亲自编写代码后说明一下集成的向导的用法。这有助于您轻松地将集成了IDE的代码改为您喜欢的代码。 本书主要内容 本书从逻辑上划分成8个不同的部分,每个部分包括一些集中了特定技术集和/或特定任务的章节。为了帮助了解本书,下面将本书逐个部分和逐章地分解。 第I部分:Visual Basic 2008与.NET平台 第I部分的目的是使您适应.NET平台、.NET类型系统和构造.NET应用程序的过程中使用的各种开发工具的核心方面。在学习过程中,也会介绍VB 2008编程语言的一些基本细节。 第1章:.NET基本原理 第1章的作用是作为本书其余部分的基石。首先,将介绍传统Windows开发的世界,并揭示以前的开发方式的缺点。然而,本章的基本目标是使您熟知一些.NET构件块,如公共语言运行库(Common Language Runtime,CLR)、公共类型系统(Common Type System,CTS)和公共语言规范(Common Language Specification,CLS)以及基类库。此外,还会初步介绍一下VB 2008编程语言和.NET程序集格式,还将介绍.NET平台的平台无关特性以及公共语言基础结构(Common Language Infrastructure,CLI)。 第2章:构建Visual Basic 2008应用程序 本章的目标是介绍用各种工具和技术编译VB 2008源代码文件的过程。首先,将介绍如何使用命令行编译器(vbc.exe)和VB 2008响应文件。在本章其余部分,将介绍各种IDE,包括SharpDevelop、Visual Basic 2008 Express和Visual Studio 2008。另外,将提供一些开放源工具,它们是很多.NET开发人员的常备工具。 第II部分:核心VB编程结构 这一部分探索VB 2008编程语言的核心方面,如固有数据类型、决策和迭代结构、构造(和重载)方法,以及操作数组、字符串、枚举和模块。接下来,将深入介绍关于结构化异常处理的作用,以及CLR如何处理内存管理细节。 第3章:VB 2008编程结构(上) 本章首先介绍VB 2008模块类型的作用,以及可执行文件的入口点(Main()方法)的相关主题。本章还会介绍VB 2008的固有数据类型(以及它们的CTS等价物)、隐式和显式类型强制转换、迭代和决策结构,以及有效代码语句的结构。 第4章:VB 2008编程结构(下) 本章将完成基本编码结构的分析。本章的主要推动力在于用VB 2008的语法挖掘构建子例程和函数的细节。接着,将会介绍ByVal、ByRef和ParamArray关键字的作用,并理解方法重载的主题。本章还介绍了如何构建和操作数组、枚举和结构,以及潜伏在后台中的底层类(System.Array、System.Enum和System.ValueType)。 第5章:设计封装类类型 本章将深入挖掘第一个“OOP支柱”:封装服务。本章不仅会介绍基本类结构(构造函数、共享成员和属性语法),而且还会研究几个辅助类设计技术,如Partial关键字的作用和XML代码文档语法。 第6章:继承与多态 第6章的作用是分析VB 2008如何考虑OOP的其余“支柱”:继承和多态。这里您将了解如何用继承、虚拟方法、抽象方法(和类),以及各种类型强制转换操作构建相关类的家族。本章还会介绍.NET基类库中的终极基类System.Object的作用。 第7章:结构化异常处理 本章的重点是讨论如何用结构化异常处理来处理代码基中的运行时异常。本章不仅将介绍解决此类问题的VB 2008关键字(Try、Catch、Throw和Finally),而且会说明应用程序级和系统级的异常之间的区别。此外,本章将介绍Visual Studio 2008中的各种工具,利用这些工具可以调试逃出您的视线的异常。 第8章:对象生存期 本章介绍CLR如何使用.NET垃圾收集器管理内存。这里您将开始理解应用程序根、对象代和System.GC类型的作用。理解了这个基础后,本章其余部分将介绍构建“可诊断对象”的主题(通过Idisposable接口)以及如何与终结进程交互(通过System.Object.Finalize()方法)。 第III部分:高级VB编程结构 这一部分加深使用VB 2008时对OOP的理解。这里您将了解接口类型、委托和事件,以及几个高级主题(如运算符重载和泛型)的作用。另外,本部分深入挖掘了新的.NET 3.5语言特性的细节,包括初步介绍LINQ。 第9章:使用接口类型 本章的内容构建在对基于对象的开发的理解之上,包括了基于接口编程的主题。这里您将学到如何定义支持多重行为的类型、如何在运行时发现这些行为,以及如何从对象级别有选择地隐藏特定行为。为了显示接口类型的有用性,本章会介绍如何使用接口构建自定义事件体系结构。 第10章:集合、泛型和可为空值的数据类型 本章首先介绍System.Collections名称空间的集合类型,它自从发布以来就是.NET平台的一部分。然而,自从.NET 2.0发布以后,VB编程语言提供了对泛型的支持。正如您会看到的,泛型编程大大增强了应用程序性能和类型安全性。您不仅可以探索System.Collections.Generic名称空间中的各种泛型类型,而且还会了解到如何构建自己的泛型方法和类型(使用和不使用约束)。 第11章:委托、事件和Lambdas 第11章的作用是揭开委托类型的面纱。简单地说,.NET委托是一个指向应用程序中的其他方法的对象。使用这种模式,可以构建允许多个对象进行双向会话的系统。介绍了.NET委托的使用之后,将介绍VB 2008的Event、RaiseEvent、Handles和Custom关键字,它们被用来简化直接使用委托的编程操作。最后,将介绍lambda表达式和VB 2008的lambda运算符的作用。 第12章:运算符重载和自定义转换例程 本章通过引入一些高级编程技术来深入理解VB 2008编程语言。本章将包含值类型和引用类型的详细分析。接着,将学习如何重载运算符和创建自定义转换例程(隐式和显式)。本章最后对比了显式类型强制转换操作中Ctype()、DirectCast()和TryCast()的使用。 第13章:VB 2008特有的语言特性 发布.NET 3.5时,VB语言被增强为支持大量新的编程结构,其中很多被用来启用 LINQ API(从第14章开始分析)。本章将阐述局部变量的隐式类型、扩展方法、匿名类型和对象初始化语法的作用。 第14章:LINQ概述 本章首先介绍LINQ,它被认为是.NET 3.5的最有吸引力的方面。在本章您将发现,LINQ允许构建强类型的查询表达式,它可以被应用到一些LINQ目标来操作意义最广泛的“数据”一词。这里,您将了解LINQ to Objects,它允许向数据的容器应用LINQ表达式(数组、集合和自定义类型)。在后面的第24章分析如何向关系数据库(通过LINQ to ADO)应用LINQ表达式和XML文档(按LINQ to XML的方式)时,这些信息将很有用。 第IV部分:使用.NET程序集编程 第IV部分深入讨论.NET程序集格式的细节。这一部分不仅介绍如何部署和配置.NET代码库,而且将介绍.NET二进制映像的内部组成。本书的这一部分还解释了.NET属性的作用和多线程应用程序的结构以及使用互操作性的程序集访问遗留COM应用程序。 第15章:.NET程序集概述 从一个很高的水平来说,程序集是用来描述托管*.dll或*.exe文件的术语。然而,.NET程序集的真正意义远不止于此。本章将讨论单个文件和多文件程序集之间的区别,以及如何构建和部署各个实体。本章将说明私有和共享程序集可以使用基于XML的*.config文件和发布策略程序集配置。本章还将研究.NET Framework配置实用程序的作用。 第16章:类型反射、迟绑定和基于属性的编程 第16章继续分析了通过System.Reflection名称空间进行运行时类型检查的过程。使用这些类型,可以构建可以即时读取程序集的元数据的应用程序。本章将讨论如何动态地使用迟绑定激活和操作运行时类型。本章的最后一个主题探索了.NET属性的作用(标准和自定义)。为了说明各个主题的有用性,本章以可扩展的Windows Forms应用程序的构造结束。 第17章:进程、AppDomains和对象上下文 现在您已对程序集有了扎实的理解,本章开始深入挖掘加载的.NET可执行文件的成分。本章的目标是为了说明进程、应用程序域和上下文的边界之间的关系。这些主题为第18章的内容提供了适当的基础。第18章将介绍多线程应用程序的结构。 第18章:构建多线程应用程序 本章介绍了如何构建多线程应用程序,并说明了一些可用来编写线程安全代码的技术。为了理解委托对异步方法调用的固有支持,本章首先回顾了.NET委托类型。接下来将研究System.Threading名称空间中的类型。您会看到很多允许轻松地创建其他执行线程的类型(Thread、ThreadStart等)。最后介绍BackgroundWorker类型,它大大简化了从桌面用户界面中线程的创建。 第19章:.NET互操作性程序集 本部分的最后一章介绍了一个名为互操作性程序集的独特.NET程序集类型。这些二进制映像用来允许.NET应用程序使用经典COM类型。一旦深入了解了.NET应用程序如何使用COM服务器的细节,然后将学习相对的功能:使用.NET对象的COM应用程序。学完本章后,就会对互操作性层有了扎实的理解。 第V部分:.NET基类库 到本书的这个部分,您已经对VB 2008语言、.NET类型系统和程序集格式有了相当好的理解。本部分利用了您新得到的知识,探索了大量常用的基类库中发现的服务,包括文件IO和使用ADO.NET的数据库访问。本部分还包括使用Windows Communication Foundation(WCF)的分布式应用程序和使用Windows Workflow Foundation(WF)API的启用工作流的应用程序。 第20章:文件和目录操作 顾名思义,System.IO名称空间允许与机器的文件和目录结构交互。在本章的学习过程中,您将学会如何通过程序创建(和销毁)目录系统以及将数据移进及移出各种流(基于文件、基于字符串、基于内存等)。 第21章:对象串行化 本章介绍.NET平台的对象串行化服务。简言之,串行化允许将一个对象(或一组相关对象)的状态保留到流中以便以后使用。反串行化是将对象从流中取到内存中以便应用程序使用的过程。一旦了解了基础知识,然后将学习如何通过Iserializable接口和一些.NET属性定制串行化过程。 第22章:ADO.NET 第1部分:连接层 在这前两章以数据库为中心的章节中,将学习ADO.NET编程API。具体地说,本章将介绍.NET数据提供者的作用,以及如何使用ADO.NET的连接层与关系数据库通信,通过连接对象、命令对象、事务对象和数据读者对象来表示。此外,本章还将介绍自定义数据库以及本书其余部分将用到的数据访问库的创建方法。 第23章:ADO.NET 第2部分:断开连接层 本章继续通过分析ADO.NET的断开连接层来研究数据库操作。本章将讨论DataSet类型、数据适配器对象和Visual Studio 2008的大量工具的作用,这些工具大大简化了数据驱动应用程序的创建。接着将介绍如何将DataTable对象绑定到用户接口元素,如Windows Forms API的GridView类型。 第24章:使用LINQ API编程 第14章介绍了LINQ编程模型,特别是LINQ to Object。本章将通过分析如何向关系数据库、DataSet对象和XML文档应用LINQ查询来深入理解语言集成查询。接着将介绍数据上下文对象、sqlmetal.exe实用程序和Visual Studio 2008的各种LINQ特有的方面的作用。 第25章:Windows通信基础 .NET 3.0引入了一个崭新的API:WCF,它允许以一种对称的方式构建分布式应用程序,不管它们的底层管道技术是什么。本章将提供WCF服务、主机和客户端的构造。WCF服务极其灵活,其中客户端和主机可以利用基于XML的配置文件来声明性地指定地址、绑定和契约。 第26章: Windows工作流基础 除了WCF外,.NET 3.0还引入了另一个API:WF,它允许定义、执行和监控对复杂业务过程建模的工作流。本章将阐述Windows Workflow Foundation的整体作用,以及活动、工作流设计器、工作流运行时引擎的作用,而且还将介绍启用了工作流的代码库的创建。 第VI部分:使用Windows Forms创建桌面应用程序 本书的这一部分介绍如何使用Windows Forms API构建图形桌面应用程序。Windows Forms是原始桌面GUI架构,自从版本1.0以来,它就是.NET基类库的一部分。虽然.NET 3.0确实自带了一个新的GUI架构(Windows Presentation Foundation),但是Windows Forms仍然是.NET开发的关键部分,并且很可能是您为很多传统业务应用程序选择的UI工具箱。 第27章:Windows Forms 本章首先介绍System.Windows.Forms名称空间。在本章中,将学习构建支持菜单系统、工具栏和状态栏的传统GUI桌面应用程序的细节。本章还将介绍Visual Studio 2008的各种设计时的细节。 第28章:使用GDI+渲染图形数据 本章包括如何在Windows Forms环境中动态地渲染图形数据。除了讨论如何操作字体、颜色、几何图像和图像文件外,本章还介绍了点击测试和基于GUI的拖放技术。此外,本章还将介绍Windows Forms资源格式,它允许将图形图像文件、字符串数据和桌面应用程序的其他方面嵌套进可执行文件本身中。 第29章:使用Windows Forms控件编程 关于Windows Forms的最后一章将介绍.NET Framework 3.5自带的大量GUI窗口小部件。在本章中,不仅将学习如何使用各种各样的Windows Forms控件编程,而且也将学习对话框开发和Form继承。另外,本章还介绍了如何构建集成到IDE中的自定义Windows Forms控件。 第VII部分:使用WPF创建桌面应用程序 本书的这一部分集中介绍名为Windows Presentation Foundation(WPF)的全新桌面编程模型。WPF是“超动力的”UI工具箱,允许构建高交互性和富媒体的桌面应用程序。在本部分中将讨论WPF的作用、名为XAML的基于XML的语法,以及几个WPF功能,如动画、图形渲染和数据绑定。 第30章:WPF和XAML .NET 3.0引入了一个全新的GUI工具箱,即WPF。本质上,WPF允许构建交互性极强的富媒体桌面应用程序(以及间接地构建Web应用程序)前台。与Windows Forms不同,这个超动力的UI架构将大量关键服务(2D和3D图形、动画、富文档等)集成到一个统一的对象模型中。本章将首先介绍WPF和Extendable Application Markup Language(XAML)。在本章中将学习如何使用XAML构建XAML-free的WPF程序,以及两者的结合。最后将构建一个自定义XAML查看器,它会在以WPF为中心的章节的其余部分使用。 第31章:使用WPF控件编程 在本章中,将介绍如何使用WPF控件内容模型,以及一些相关的以控件为中心的主题,如依赖性属性和例程事件。本章包括了使用大量WPF控件;而且,本章还将解释布局管理程序、控件命令行和WPF数据绑定模型的使用。 第32章:WPF二维图形渲染、资源和主题 本部分的最后一章将通过分析3个表面上相互独立的主题来介绍WPF。然而, WPF的图形渲染服务通常要求定义自定义资源。使用这些资源,可以生成自定义WPF动画,以及使用图形、资源和动画,还可以为WPF应用程序构建自定义主题。为了将所有这些主题结合到一起,本章最后说明了如何在运行时应用自定义图形主题。 第VIII部分:用ASP.NET构建Web应用程序 本书的最后一部分致力于用ASP.NET构造Web应用程序。ASP.NET被有意识地设计成通过在标准HTTP请求/响应上放置一个事件驱动的且面向对象的架构来为桌面用户界面创建建模。 第33章:构建ASP.NET Web页面 本章首先研究在使用ASP.NET的.NET平台下支持的Web技术。服务器端脚本代码现在用“真正的”面向对象语言(如VB 2008、C#等)替代了。本章将介绍关键ASP.NET主题,如使用(或不使用)code-behind文件、ASP.NET 3.5目录结构以及web.config文件的作用。 第34章:ASP.NET Web控件、主题和Master页面 本章将深入挖掘ASP.NET Web控件的详细信息。一旦理解了这些Web窗口小部件的基本功能,然后就会用各种各样的.NET 3.5功能(Master页面、*.sitemap文件、主题和皮肤)构建一个简单然而有说明性的Web站点。另外,本章将介绍有效性验证器控件和增强的数据绑定引擎的使用。 第35章:ASP.NET状态管理技术 本章将介绍在.NET下处理状态管理的各种方式,从而扩展对当前ASP.NET的理解。像经典ASP一样,ASP.NET允许轻松地创建cookies,以及应用程序级和会话级变量。一旦学习了使用ASP.NET处理状态的各种方式,然后就开始学习System.HttpApplication基类(潜伏在 Global.asax文件中)的作用。最后我们介绍ASP.NET配置文件管理API。 获取本章的源代码 本书包含的所有代码示例(散布在全书中的小块代码)都可以免费使用,并可以立即从Apress Web站点的Source Code区域下载。简单地导航到,选择Source Code/Download链接,并按照书名查找本书。一旦找到Pro VB 2008 and the .NET 3.5 Platform的页面,就可以下载一个自解压的*.zip文件。当解压缩内容时,将发现代码已经按照各章逻辑性划分了。此外,示例代码还可以从www.tupwk.com.cn/downpage下载。 注意,各章中像下面这样的“源代码”指示正在讨论的示例的线索,可以将它们加载到Visual Studio 2008中以便进一步分析和修改。 源代码: 这是将您指向特定目录的源代码通知! 要做到这一点,简单地打开在正确的子目录中找到的*.sln文件。如果使用的不是Visual Studio 2008(参见第2章的其他IDE),可以将提供的源代码手动加载到所选择的开发工具中。 获取本书的更新 当您阅读本书时,可能发现一个偶然的图形化或代码错误(虽然笔者很希望没有)。 如果出现这种情况,笔者表示抱歉。作为一个人,尽管笔者尽了努力,但仍然可能存在一些小错误。如果有这种情况,可以从Apress Web站点中获得本书的勘误表(也位于本书的主页上),以及关于如何将您发现的任何错误通知笔者的信息。 联系作者 如果您对关于本书的源代码有任何问题,需要弄明白给定的示例,或者只是希望提供您关于.NET的想法,请给作者发电子邮件(为了确保您的邮件不进入垃圾邮件文件夹,请在主题中包括“VB TE”字样):atroelsen@intertech.com或wkservice@vip.163.com。 总之,感谢您购买本书(或者至少在书店浏览本书以决定是否购买)。希望您喜欢阅读本书,并充分利用您新学到的知识。