.NET3.5与VB2008高级编程(第3版)

.NET3.5与VB2008高级编程(第3版)"

作者:姜玲玲、唐明霞
ISBN:9787302208419
定价:¥139
字数:千字
页数:
出版时间:2009.10.01
开本:
版次:1-1
装帧:
出版社:清华大学出版社
简介

本书的第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”等绰号来表达他们的不满。事实上,甚至有人开发了网站(http://vb.mvps.org/vfred/Trust.asp),专门写了请愿书,抨击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区域下载。简单地导航到http://www.apress.com,选择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。

  总之,感谢您购买本书(或者至少在书店浏览本书以决定是否购买)。希望您喜欢阅读本书,并充分利用您新学到的知识。

  

 

  

  

  

  

目录

第I部分  Visual Basic 2008

          与.NET平台

第1章  .NET基本原理 3

1.1  历史状态 3

1.1.1  C/Win32 API程序员的生活 3

1.1.2  C++/MFC程序员的生活 4

1.1.3  Visual Basic 6.0程序员的生活 4

1.1.4  Java/J2EE程序员的生活 4

1.1.5  COM程序员的生活 5

1.1.6  Windows DNA程序员的生活 5

1.2  .NET解决方案 6

1.3  .NET平台的构件块

     (CLR、CTS与CLS) 6

1.4  Visual Basic 2008的新内容 7

1.5  其他.NET支持语言 8

1.6  .NET程序集概览 10

1.6.1  单文件与多文件程序集 11

1.6.2  公共中间语言的作用 11

1.6.3  .NET类型元数据的作用 14

1.6.4  程序集清单的作用 15

1.7  公共类型系统 15

1.7.1  CTS类类型 16

1.7.2  CTS 接口类型 16

1.7.3  CTS结构类型 16

1.7.4  CTS枚举类型 17

1.7.5  CTS委托类型 17

1.7.6  CTS类型成员 17

1.7.7  固有CTS数据类型 18

1.8  公共语言规范 18

1.9  了解公共语言运行库 20

1.10  程序集/名称空间/类型

      之间的区别 21

1.10.1  通过编程访问名称空间 24

1.10.2  引用外部程序集 25

1.11  使用ildasm.exe 25

1.11.1  查看CIL代码 26

1.11.2  查看类型元数据 26

1.11.3  查看程序集元数据

   (也称为清单) 27

1.12  使用Lutz Roeder的reflector 27

1.13  部署.NET运行库 28

1.14  .NET的平台无关特性 29

1.15  小结 30

第2章  构建Visual Basic 2008

        应用程序 31

2.1  .NET Framework 3.5 SDK

     的作用 31

2.2  VB 2008命令行编译器

     (vbc.exe) 32

2.3  使用vbc.exe构建VB 2008

     应用程序 32

2.3.1  使用vbc.exe引用外部程序集 34

2.3.2  使用vbc.exe编译多个源文件 35

2.3.3  使用vbc.exe引用多个外部

程序集 36

2.4  使用vbc.exe响应文件 36

2.5  使用SharpDevelop构建.NET

    应用程序 38

2.6  使用Visual Basic 2008 Express

     构建.NET应用程序 41

2.7  使用Visual Studio 2008构建

     .NET应用程序 42

2.7.1  Visual Studio 2008的一些

特有功能 42

2.7.2  使用New Project对话框

选择.NET Framework的版本 43

2.7.3  使用Solution Explorer实用程序 43

2.7.4  Class View实用程序 45

2.7.5  Object Browser实用程序 45

2.7.6  Visual Studio 2008代码

片断技术 45

2.7.7  可视化类设计器 46

2.7.8  Object Test Bench 49

2.7.9  综合帮助系统 50

2.8  Visual Basic 6.0兼容性

     程序集的作用 51

2.9  其他.NET开发工具的

     部分 52

2.10  小结 53

第II部分  核心VB编程结构

第3章  VB 2008编程结构(上) 57

3.1  Module类型的作用 57

3.1.1  带多个模块的项目 58

3.1.2  模块是不能创建的 59

3.1.3  重命名初始模块 60

3.1.4  模块的成员 60

3.2  Main方法的作用 61

3.2.1  使用System.Environment

处理命令行参数 61

3.2.2  使用Main()处理命令行参数 62

3.2.3  Main()作为函数(而不是

   作为子例程) 62

3.2.4  使用Visual Studio 2008指定

命令行参数 63

3.3  一个有趣的附加作用:

     System.Environment类的一些

     其他成员 63

3.4  System.Console类 64

3.4.1  使用Console类的基本

输入输出 65

3.4.2  格式化控制台输出 65

3.4.3  .NET字符串格式化标记 66

3.4.4  使用String.Format()格式化

字符串 67

3.5  系统数据类型与VB简洁

     表示法 67

3.5.1  变量声明和初始化 68

3.5.2  数据类型的默认值 69

3.5.3  数据类型类层次结构 70

3.5.4  固有数据类型和New关键字 71

3.5.5  体验数值数据类型 71

3.5.6  System.Boolean的成员 72

3.5.7  System.Char的成员 72

3.5.8  分析字符串数据中的值 73

3.6  System.String类型 73

3.6.1  基本字符串操作 74

3.6.2  字符串连接(以及Newline常量) 74

3.6.3  字符串和相等 76

3.6.4  字符串是不能改变的 76

3.6.5  System.Text.StringBuilder类型 77

3.7  窄化(显式)或宽化(隐式)的

     数据类型转换 78

3.7.1  Option Strict 80

3.7.2  显式转换函数 82

3.7.3  System.Convert的作用 83

3.8  构建Visual Basic 2008

     代码语句 83

3.8.1  语句延续字符 83

3.8.2  在单行上定义多个语句 84

3.9  VB 2008流程控制语句结构 85

3.9.1  If/Then/Else语句 85

3.9.2  构建复杂条件表达式 86

3.9.3  Select/Case语句 87

3.10  VB 2008迭代结构 87

3.10.1  For/Next循环 88

3.10.2  For/Each循环 88

3.10.3  Do/While和Do/Until

       循环结构 89

3.10.4  With结构 90

3.11  小结 90

第4章  VB 2008编程结构(下) 91

4.1  定义子例程与函数 91

4.1.1  ByVal参数修饰符 92

4.1.2  ByRef参数修饰符 93

4.1.3  定义可选参数 94

4.1.4  使用ParamArrays 95

4.1.5  方法调用约定 96

4.1.6  包含静态局部变量的方法 97

4.2  成员重载 98

4.2.1  Overloads关键字 99

4.2.2  方法重载的细节 99

4.3  VB 2008中的数组操作 100

4.3.1  VB 2008数组初始化语法 101

4.3.2  定义Objects的数组 101

4.3.3  定义数组的下边界 102

4.3.4  Redim/Preserve语法 103

4.3.5  使用多维数组 104

4.3.6  System.Array类 105

4.4  VB 2008的枚举 106

4.4.1  控制枚举的底层存储 107

4.4.2  声明和使用枚举 107

4.4.3  System.Enum类型(以及解析关

键字命名冲突的一个教训) 108

4.4.4  动态地发现枚举的名/值对 110

4.5  VB 2008结构类型 111

4.6  小结 113

第5章  设计封装类类型 114

5.1  VB 2008类类型简介 114

5.2  类构造函数 117

5.2.1  默认构造函数的作用 119

5.2.2  定义自定义构造函数 119

5.2.3  再次介绍默认构造函数 120

5.3  Me关键字的作用 121

5.3.1  使用Me链接构造函数调用 123

5.3.2  观察构造函数流程 125

5.4  Shared关键字 126

5.4.1  定义共享方法(和字段) 126

5.4.2  定义共享数据 128

5.4.3  定义共享构造函数 130

5.5  定义OOP的支柱 131

5.5.1  封装的作用 132

5.5.2  继承的作用 132

5.5.3  多态的作用 133

5.6  Visual Basic 2008访问修饰符 134

5.6.1  访问修饰符与嵌套类型 135

5.6.2  默认访问修饰符 135

5.6.3  访问修饰符与字段数据 136

5.7  第一个支柱:VB 2008的

     封装服务 136

5.7.1  使用传统的取值和赋值封装 137

5.7.2  使用属性封装 138

5.7.3  属性的内部表示 140

5.7.4  控制属性可见性级别的

Get/Set语句 142

5.7.5  只读和只写属性 142

5.7.6  共享属性 142

5.8  常量数据 143

5.9  只读字段 145

5.10  局部类型定义 146

5.11  通过XML文档化VB 2008

      源代码 147

5.12  使我们的概念形象化 151

5.13  小结 151

第6章  继承与多态 152

6.1  继承的基本机制 152

6.1.1  Inherits关键字 153

6.1.2  关于多个基类 154

6.1.3  NotInheritable关键字 155

6.2  修订Visual Studio 2008类图 156

6.3  第二个支柱:继承的细节 157

6.3.1  使用MyBase控制基类的创建 159

6.3.2  Protected关键字 160

6.3.3  添加密封类 161

6.4  包容/委托模型的编程 162

6.5  第三个支柱:VB 2008的

     多态支持 165

6.5.1  Overridable和Overrides

关键字 166

6.5.2  用Visual Studio 2008进行重写 167

6.5.3  NotOverridable关键字 168

6.5.4  抽象类和MustInherit关键字 169

6.5.5  用MustOverride构建一个

多态接口 170

6.5.6  成员屏蔽 173

6.6  基类/派生类的类型强制

     转换规则 174

6.7  终极父类:System.Object 176

6.7.1  重写System.Object.ToString() 179

6.7.2  重写System.Object.Equals() 179

6.7.3  重写

System.Object.GetHashCode() 180

6.7.4  测试修改后的Person类 181

6.7.5  System.Object的共享成员 181

6.8  小结 182

第7章  结构化异常处理 183

7.1  关于错误、bug和异常 183

7.2  .NET异常处理的作用 184

7.2.1  .NET异常处理的原子性 184

7.2.2  System.Exception基类 185

7.3  最简单的示例 186

7.3.1  抛出一个简单的异常 187

7.3.2  捕获异常 188

7.4  配置异常的状态 189

7.4.1  TargetSite属性 189

7.4.2  StackTrace属性 190

7.4.3  HelpLink属性 190

7.4.4  Data属性 191

7.5  系统级异常

     (System.SystemException) 192

7.6  应用程序级异常

     (System.ApplicationException) 193

7.6.1  构建自定义异常(I) 193

7.6.2  构建自定义异常(II) 195

7.6.3  构建自定义异常(III) 195

7.6.4  按Visual Studio方式构建

自定义异常 196

7.7  处理多个异常 196

7.7.1  广义Catch语句 198

7.7.2  重新抛出异常 199

7.7.3  内部异常 199

7.8  Finally块 200

7.9  谁在抛出什么 201

7.10  未处理异常的结果 202

7.11  使用Visual Studio 2008

      调试未处理异常 202

7.12  融合VB6错误处理与

      结构化异常处理 203

7.13  小结 204

第8章  对象生存期 205

8.1  类、对象和引用 205

8.2  对象生存期基础 206

8.2.1  CIL的New关键字 207

8.2.2  将对象引用设置成Nothing 208

8.3  应用程序根的作用 209

8.4  对象代 210

8.5  System.GC类型 210

8.6  构建可终结对象 213

8.6.1  重写System.Object.Finalize() 214

8.6.2  详细介绍终结过程 215

8.7  构建可诊断对象 216

8.8  构建可终结和可诊断类型 218

8.9  小结 220

第III部分  高级VB编程结构

第9章  使用接口类型 223

9.1  接口类型 223

9.2  定义自定义接口 225

9.3  实现接口 226

9.3.1  更新Hexagon类 227

9.3.2  支持多个接口的类型 228

9.4  与支持接口的类型进行交互 229

9.4.1  使用CType()获取接口引用 230

9.4.2  使用TypeOf/Is获取接口引用 230

9.4.3  作为成员参数的接口 231

9.4.4  作为返回值的接口 233

9.4.5  接口类型的数组 234

9.5  使用Implements关键字解决

     名称冲突问题 234

9.5.1  通过Implements关键字定义

通用实现方式 236

9.5.2  使用Implements关键字对对象

级别隐藏接口方法 237

9.5.3  设计接口层次结构 238

9.6  构建可枚举的类型

     (IEnumerable和IEnumerator) 239

9.6.1  构建可以克隆的对象

(ICloneable) 241

9.6.2  一个更精细的克隆示例 243

9.7  构建可比较的对象

     (IComparable) 246

9.7.1  指定多种排序次序(IComparer) 248

9.7.2  自定义属性与自定义排序类型 249

9.8  使用接口作为回调机制 250

9.9  小结 253

第10章  集合、泛型和可为空值的

         数据类型 254

10.1  System.Collections的

      非泛型类型 254

10.1.1  System.Collections命名

       空间的接口 255

10.1.2  IDictionaryEnumerator

       的作用 256

10.1.3  IList的作用 256

10.1.4  System.Collections的类类型 257

10.2  System.Collections.Specialized

      名称空间 260

10.3  包装与解除包装操作 261

10.3.1  部分包装和解除包装实例 262

10.3.2  解除自定义值类型的包装 263

10.3.3  包装和解除包装操作的问题 264

10.4  类型安全性和强类型的集合 264

10.5  System.Collections.Generic

      名称空间 269

10.6  可为空值的数据类型和

      System.Nullable(Of T)

      泛型类型 272

10.6.1  使用可为空值的类型 273

10.6.2  Visual Basic 2008可为

        空值的运算符(?) 274

10.7  创建泛型方法 275

10.8  创建泛型结构(或类) 277

10.9  创建自定义泛型集合 279

10.9.1  自定义泛型集合类的用处 280

10.9.2  约束类型参数 282

10.9.3  缺少运算符约束 283

10.10  创建泛型接口 284

10.11  创建泛型委托 285

10.12  小结 287

第11章  委托、事件和Lambdas 288

11.1  了解.NET委托类型 288

11.1.1  在VB 2008中定义

       委托类型 289

11.1.2  研究自动生成的类类型 290

11.1.3  System.MulticastDelegate和

       System.Delegate基类 291

11.2  可能最简单的委托示例 292

11.3  使用委托更新Car类型 294

11.3.1  激活多播 297

11.3.2  从委托的调用列表中

       删除目标 298

11.4  了解(和使用)事件 299

11.4.1  使用RaiseEvent关键字

       激活事件 299

11.4.2  事件的本质 300

11.4.3  使用WithEvents和Handles

       关联引入的事件 301

11.4.4  使用Handles关键字多播 302

11.4.5  为多个事件定义单个

       处理程序 302

11.4.6  使用AddHandler/RemoveHandler

       动态关联引入的事件 303

11.5  定义“规规矩矩的”事件 304

11.6  定义强类型事件 306

11.7  定制事件注册过程 307

11.7.1  定义自定义事件 307

11.7.2  使用自定义委托来

       自定义事件 309

11.8  Visual Basic Lambda表达式 310

11.8.1  分解Lambda表达式 312

11.8.2  使用多个参数的Lambda

       表达式 313

11.8.3  使用自定义方法赋值

       Lambda参数 314

11.8.4  使用Zero参数的

       Lambda表达式 315

11.9  小结 315

第12章  运算符重载和自定义

          转换程序 316

12.1  运算符重载 316

12.1.1  运算符重载的情况 317

12.1.2  重载二元运算符 319

12.1.3  重载相等运算符 320

12.1.4  重载比较运算符 320

12.1.5  关于运算符重载的最后思考 321

12.2  值类型和引用类型的

      详细情况 322

12.2.1  值类型、引用类型

       和赋值运算符 323

12.2.2  包含引用类型的值类型 325

12.2.3  按值传递引用类型 326

12.2.4  按引用传递引用类型 327

12.2.5  值和引用类型:最后的细节 328

12.2.6  回顾:数值转换 329

12.2.7  回顾:相关类类型之间

       的转换 329

12.3  创建自定义转换程序 330

12.4  定义隐式转换程序 332

12.5  VB DirectCast关键字 334

12.6  小结 336

第13章  VB 2008特有的语言特性 337

13.1  了解隐式数据类型化 337

13.1.1  迭代结构中的隐式类型化 339

13.1.2  隐式类型数据是强类型数据 340

13.1.3  禁用Option Infer 340

13.1.4  后期绑定与隐式类型化 341

13.1.5  隐式类型变量的限制 343

13.1.6  隐式类型局部变量的有用性 343

13.2  了解扩展方法 344

13.2.1  定义扩展方法 344

13.2.2  重载扩展方法 345

13.2.3  在实例级别上调用扩展方法 346

13.2.4  调用定义模块上的扩展方法 346

13.2.5  扩展方法的作用域 347

13.2.6  导入定义扩展方法的类型 348

13.2.7  使用Visual Studio 2008

       标识扩展方法 349

13.2.8  构建和使用扩展库 349

13.2.9  通过扩展方法扩展接口类型 350

13.3  对象初始化器语法 351

13.3.1  使用初始化语法调用

       自定义构造函数 353

13.3.2  初始化包含的类型 354

13.4  匿名类型 355

13.4.1  匿名类型的内部表示 356

13.4.2  ToString()和GetHashCode()

       的实现方式 357

13.4.3  匿名类型相等性的语义 357

13.4.4  包含匿名类型的匿名类型 359

13.5  小结 359

第14章  LINQ概述 360

14.1  了解LINQ的作用 360

14.1.1  LINQ表达式是强类型

       且可扩展 361

14.1.2  核心LINQ程序集 361

14.2  LINQ查询表达式概述 362

14.2.1  LINQ和隐式类型局部变量 364

14.2.2  LINQ和扩展方法 365

14.2.3  延期执行的作用 365

14.2.4  立即执行的作用 366

14.3  LINQ和泛型集合 367

14.4  LINQ和非泛型集合 368

14.5  LINQ查询运算符的

     内部表示 370

14.5.1  使用查询运算符构建查询

       表达式(重访) 371

14.5.2  使用Enumerable类型和

       Lambda构建查询表达式 371

14.5.3  使用Enumerable类型和原始

       委托构建查询表达式 372

14.6  VB LINQ查询运算符 373

14.6.1  使用Enumerable计数 374

14.6.2  构建新的测试项目 374

14.7  LINQ查询:本身是孤岛吗 379

14.8  小结 381

第IV部分  使用.NET程序集编程

第15章  .NET程序集概述 385

15.1  .NET程序集的作用 385

15.1.1  程序集提示代码重用 385

15.1.2  程序集建立类型边界 386

15.1.3  程序集是可版本化单元 386

15.1.4  程序集是自描述对象 386

15.1.5  程序集是可配置对象 386

15.2  了解.NET程序集的格式 387

15.2.1  Win32文件头 387

15.2.2  CLR文件头 387

15.2.3  CIL代码、类型元数据

       和程序集清单 388

15.2.4  可选的程序集资源 389

15.2.5  单文件和多文件的程序集 389

15.3  构造自定义的.NET

      名称空间 390

15.3.1  观察根名称空间 391

15.3.2  定义根名称空间以外的

       名称空间 392

15.3.3  导入自定义的名称空间 393

15.3.4  使用Imports关键字构建

       类型别名 393

15.4  构建和使用单文件程序集 395

15.4.1  清单 397

15.4.2  CIL 398

15.4.3  类型元数据 399

15.4.4  构建VB 2008客户端

       应用程序 400

15.4.5  构建C#客户端应用程序 401

15.4.6  使用跨语言继承 402

15.5  构建和使用多文件程序集 403

15.5.1  ufo.netmodule文件 404

15.5.2  airvehicles.dll文件 404

15.5.3  使用多文件程序集 405

15.6  私有程序集 406

15.6.1  私有程序集的身份 406

15.6.2  探查过程 406

15.6.3  配置私有程序集 407

15.6.4  配置文件和

       Visual Studio 2008 409

15.6.5  .NET Framework配置

       实用程序 409

15.7  共享程序集 411

15.7.1  强名 411

15.7.2  使用sn.exe强命名

       CarLibrary.dll 413

15.7.3  使用Visual Studio 2008

       分配强名 414

15.7.4  在GAC中安装/删除

       共享程序集 414

15.8  使用共享程序集 415

15.9  配置共享程序集 416

15.9.1  冻结当前的共享程序集 417

15.9.2  构建共享程序集版本2.0.0.0 417

15.9.3  动态重定向到共享程序集

       的特定版本 418

15.9.4  回顾.NET Framework

       配置实用程序 419

15.10  发布者策略程序集 420

15.11  <codeBase>元素 421

15.12  System.Configuration

       名称空间 423

15.13  小结 424

第16章  类型反射、后期绑定

          和基于属性的编程 425

16.1  类型元数据的必要性 425

16.1.1  查看EngineState枚举的

       (部分)元数据 426

16.1.2  查看Car类型的(部分)

       元数据 426

16.1.3  TypeRef 427

16.1.4  归档定义的程序集 428

16.1.5  归档引用的程序集 428

16.1.6  归档字符串文字 428

16.2  反射 429

16.2.1  System.Type类 430

16.2.2  使用System.Object.GetType()

       获得类型引用 430

16.2.3  使用System.Type.GetType()

       获得类型引用 431

16.2.4  使用GetType()

       获得类型引用 431

16.3  构建自定义的元数据

      查看程序 432

16.3.1  方法的反射 432

16.3.2  字段和属性的反射 432

16.3.3  已实现接口的反射 433

16.3.4  显示各种零碎的内容 433

16.3.5  实现Main()方法 433

16.3.6  方法参数和返回值的反射 434

16.4  动态加载程序集 435

16.5  共享程序集的反射 437

16.6  后期绑定 439

16.6.1  使用System.Activator类

       执行后期绑定 439

16.6.2  调用无参数的方法 440

16.6.3  调用带有参数的方法 440

16.7  属性编程 441

16.7.1  属性使用程序 441

16.7.2  在VB 2008中应用预先定义

       的属性 442

16.7.3  指定属性的构造函数参数 443

16.7.4  实际应用的<Obsolete()>

       属性 444

16.7.5  VB 2008属性简写符号 444

16.8  构建自定义的属性 445

16.8.1  应用自定义属性 445

16.8.2  限制属性使用 446

16.9  程序集级(和模块级)的属性 447

16.10  使用早期绑定反射属性 448

16.11  使用后期绑定反射属性 449

16.12  综合介绍反射、后期绑定

       和自定义属性 450

16.13  构建可扩展的应用程序 451

16.13.1  构建Common

        SnappableTypes.dll 451

16.13.2  构建VB 2008管理单元 452

16.13.3  构建C#管理单元 453

16.13.4  构建可扩展的Windows 

        Forms应用程序 453

16.14  小结 455

第17章  进程、AppDomain和

         对象上下文 456

17.1  回顾传统的Win32进程 456

17.1.1  线程概览 457

17.1.2  在.NET平台下与进程交互 458

17.1.3  列举运行的进程 459

17.1.4  研究特定的进程 460

17.1.5  研究进程的线程集 460

17.1.6  研究进程的模块集 462

17.1.7  以编程方式启动和停止进程 462

17.2  .NET应用程序域 463

17.2.1  列举进程的AppDomain 464

17.2.2  以编程方式创建新的

       AppDomain 465

17.2.3  以编程方式卸载AppDomain 467

17.3  对象上下文边界 468

17.3.1  上下文敏捷和上下文

       绑定类型 468

17.3.2  定义上下文绑定对象 469

17.3.3  检查对象的上下文 469

17.4  总结进程、应用程序域和

      上下文 471

17.5  小结 471

第18章  构建多线程应用程序 472

18.1  进程/应用程序域/上下文

      /线程之间的关系 472

18.2  简要回顾.NET委托 474

18.3  委托的异步特性 476

18.3.1  BeginInvoke() 和 

       EndInvoke()方法 476

18.3.2  System.IAsyncResult接口 476

18.4  异步调用方法 477

18.4.1  同步调用线程 477

18.4.2  AsyncCallback委托的作用 479

18.4.3  AsyncResult类的作用 480

18.4.4  传递和接收自定义的

       状态数据 480

18.5  System.Threading名称空间 481

18.6  System.Threading.Thread类 482

18.6.1  获得当前线程的统计 483

18.6.2  Name属性 483

18.6.3  Priority属性 484

18.7  以编程方式创建辅助线程 484

18.7.1  使用ThreadStart委托 485

18.7.2  创建线程:速记符号 486

18.7.3  使用ParameterizedThreadStart

       委托 487

18.7.4  前台线程和后台线程 488

18.8  并发性问题 489

18.8.1  使用SyncLock关键字同步 491

18.8.2  使用System.Threading.Monitor

       类型同步化 492

18.8.3  使用System.Threading.

       Interlocked类型同步 493

18.8.4  使用<Synchronization()>

       属性同步 494

18.9  使用TimerCallback编程 495

18.10  CLR线程池 496

18.11  BackgroundWorker组件

       的作用 497

18.11.1  使用BackgroundWorker

        类型 498

18.11.2  使用BackgroundWorker

        类型处理数据 499

18.12  小结 500

第19章  .NET互操作性程序集 501

19.1  .NET互操作性的作用域 501

19.2  .NET到COM互操作性的

      简单示例 502

19.3  .NET互操作程序集 504

19.4  运行库可调用封装程序 506

19.4.1  RCW:将COM类型转换

       为.NET类型 507

19.4.2  RCW:管理COM类

       (coclass)的引用计数 507

19.4.3  RCW:隐藏低级的

       COM接口 508

19.5  COM IDL的作用 508

19.5.1  观察为VB COM服务器

       生成的IDL 510

19.5.2  IDL属性 510

19.5.3  IDL库语句 511

19.5.4  [default]接口的作用 511

19.5.5  IDispatch的作用 511

19.5.6  IDL形参属性 512

19.5.7  使用类型库构建互操作

       程序集 512

19.6  后期绑定CoCalc COM类 513

19.7  构建更有趣的VB6 COM

      服务器 514

19.7.1  支持额外的COM接口 515

19.7.2  提供内部对象 516

19.8  互操作程序集 517

19.8.1  构建VB 2008客户端

       应用程序 518

19.8.2  与CoCar类型交互 518

19.8.3  截获COM事件 520

19.9  COM到.NET互操作性 521

19.10  CCW的作用 522

19.11  .NET类接口的作用 522

19.12  构建.NET类型 523

19.12.1  使用Visual Studio 2008

        插入COM类 524

19.12.2  定义强名 526

19.13  生成类型库并注册

       .NET类型 526

19.14  导出的类型信息 527

19.15  构建VB6测试客户端 528

19.16  小结 528

第V部分  .NET基类库

第20章  文件和操作 531

20.1  System.IO名称空间 531

20.2  Directory(Info)和

      File(Info)类型 532

20.3  使用DirectoryInfo类型 533

20.3.1  使用DirectoryInfo类型

       列举文件 534

20.3.2  使用DirectoryInfo类型

       创建子 535

20.4  使用Directory类型 536

20.5  使用DriveInfo类类型 537

20.6  使用FileInfo类 537

20.6.1  FileInfo.Create()方法 538

20.6.2  FileInfo.Open()方法 539

20.6.3  FileInfo.OpenRead()和

       FileInfo.OpenWrite()方法 540

20.6.4  FileInfo.OpenText()方法 540

20.6.5  FileInfo.CreateText()和

       FileInfo.AppendText()方法 541

20.7  使用File类型 541

20.8  抽象的Stream类 543

20.9  使用StreamWriter和

      StreamReader 545

20.9.1  写入文本文件 546

20.9.2  从文本文件读取 546

20.9.3  直接创建Stream

       Writer/StreamReader对象 547

20.10  使用StringWriter和

       StringReader 548

20.11  使用BinaryWriter和

       BinaryReader 549

20.12  以编程方式“监视”文件 551

20.13  执行异步文件I/O 552

20.14  小结 554

第21章  对象串行化 555

21.1  了解对象串行化 555

21.2  配置用于串行化的对象 557

21.3  选择串行化格式器 558

21.3.1  IFormatter和

       IRemotingFormatting接口 559

21.3.2  格式器之间的类型精确度 560

21.4  使用BinaryFormatter串行化

      对象 560

21.5  使用SoapFormatter

      串行化对象 562

21.6  使用XmlSerializer

      串行化对象 563

21.7  持久保存对象集合 565

21.8  自定义串行化过程 567

21.8.1  深入研究对象串行化 567

21.8.2  使用ISerializable自定义

       串行化 568

21.8.3  使用属性自定义串行化 570

21.9  小结 572

第22章  ADO.NET第1部分:

         连接层 573

22.1  ADO.NET的高级定义 573

22.2  ADO.NET数据提供者 574

22.2.1  Microsoft提供的ADO.NET

       数据提供者 576

22.2.2  获得第三方的ADO.NET

       数据提供者 577

22.3  额外的ADO.NET名称空间 577

22.4  System.Data名称空间的类型 578

22.4.1  IDbConnection接口的作用 579

22.4.2  IDbTransaction接口的作用 579

22.4.3  IDbCommand接口的作用 579

22.4.4  IDbDataParameter和

       IDataParameter接口的作用 580

22.4.5  IDbDataAdapter和

       IDataAdapter接口的作用 580

22.4.6  IDataReader和IDataRecord

       接口的作用 581

22.5  使用接口抽象化数据提供者 582

22.6  创建AutoLot数据库 585

22.6.1  创建Inventory表 585

22.6.2  创建GetPetName()存储过程 586

22.6.3  创建Customers和Orders表 587

22.6.4  可视化创建表关系 587

22.7  ADO.NET数据提供者

      工厂模型 588

22.7.1  已注册的数据提供者工厂 589

22.7.2  完整的数据提供者工厂

       模型示例 590

22.7.3  <connectionStrings>元素 592

22.8  ADO.NET的连接层 593

22.8.1  使用连接对象 594

22.8.2  使用ConnectionStringBuilder

       对象 596

22.8.3  使用命令对象 597

22.9  使用数据读取器 598

22.10  构建可重用的数据访问库 600

22.10.1  添加连接逻辑 601

22.10.2  添加插入逻辑 602

22.10.3  添加删除逻辑 602

22.10.4  添加更新逻辑 603

22.10.5  添加选择逻辑 603

22.10.6  使用参数化的命令对象 603

22.10.7  使用DbCommand执行

        存储过程 605

22.11  创建基于控制台UI的前端 607

22.11.1  实现Main()方法 607

22.11.2  实现ShowInstructions()

        和ClearConsole()方法 609

22.11.3  实现ListInventory()方法 609

22.11.4  实现DeleteCar()方法 610

22.11.5  实现InsertNewCar()方法 610

22.11.6  实现UpdateCarPetName()

        方法 610

22.11.7  调用存储过程 611

22.12  使用SqlCommand执行异步

       数据访问 611

22.13  数据库事务 613

22.13.1  ADO.NET事务对象的

        关键成员 614

22.13.2  向InventoryDAL

        添加事务方法 614

22.13.3  测试数据库事务 616

22.14  小结 617

第23章  ADO.NET第2部分:

         断开连接层 618

23.1  ADO.NET的断开连接层 618

23.2  DataSet的作用 619

23.2.1  DataSet的关键属性 619

23.2.2  DataSet的关键方法 620

23.2.3  构建DataSet 620

23.3  使用DataColumn 621

23.3.1  构建DataColumn 622

23.3.2  启用自动递增字段 622

23.3.3  向DataTable添加

       DataColumn 623

23.4  使用DataRow 623

23.4.1  RowState属性 625

23.4.2  DataRowVersion属性 626

23.5  使用DataTable 627

23.5.1  在DataSet中插入

       DataTable 627

23.5.2  使用DataTableReader

       对象处理DataTable数据 628

23.5.3  将DataTable/DataSet对象

       串行化为XML 629

23.5.4  以二进制格式串行化

       DataTable/DataSet对象 630

23.6  将DataTable对象绑定到用户

     界面 631

23.6.1  通过泛型List(Of T)

       填充DataTable 632

23.6.2  以编程方式删除行 634

23.6.3  基于筛选标准选择行 635

23.6.4  更新行 637

23.6.5  使用DataView类型 638

23.6.6  最后的UI增强:呈现行号 639

23.7  使用数据适配器填充

      DataSet/DataTable对象 640

23.7.1  简单的数据适配器示例 640

23.7.2  将数据库名映射为友好名称 641

23.8  重新访问AutoLotDAL.dll 642

23.8.1  定义初始的类类型 642

23.8.2  使用SqlCommandBuilder

       配置数据适配器 643

23.8.3  实现GetAllInventory() 644

23.8.4  实现UpdateInventory() 644

23.8.5  构建Windows Forms前端 644

23.9  定位多表的DataSet对象 646

23.9.1  准备数据适配器 646

23.9.2  构建表关系 648

23.9.3  更新数据库表 648

23.9.4  在相关表之间定位 648

23.10  Visual Studio 2008的数据

       访问工具 651

23.10.1  可视化设计DataGridView 651

23.10.2  app.config文件和

        Settings.Settings文件 653

23.10.3  研究生成的DataSet 654

23.10.4  研究生成的DataTable

        和DataRow 656

23.10.5  研究生成的数据适配器 656

23.10.6  在代码中使用生成的类型 657

23.11  从UI层分离自动生成

      的代码 659

23.12  小结 661

第24章  使用LINQ API编程 662

24.1  LINQ to ADO.NET的作用 662

24.2  使用LINQ to DataSet编程 663

24.2.1  DataSet扩展的作用 664

24.2.2  获得LINQ兼容的DataTable 664

24.2.3  EnumerableRowCollection的

       隐式接口 666

24.2.4  DataRowExtensions.Field

       (Of T)()扩展方法的作用 666

24.2.5  通过LINQ查询填充新

       的DataTable 667

24.3  使用LINQ to SQL编程 668

24.3.1  实体类的作用 668

24.3.2  DataContext类型的作用 668

24.3.3  简单的LINQ to SQL示例 669

24.3.4  构建强类型的DataContext 670

24.3.5  详细介绍<Table()>和

       <Column()>属性 671

24.4  使用sqlmetal.exe生成

      实体类 672

24.4.1  研究生成的实体类 673

24.4.2  使用实体类定义关系 674

24.4.3  强类型的DataContext 675

24.4.4  针对生成的类型编程 676

24.5  使用Visual Studio 2008构建

      实体类 677

24.5.1  插入新项 678

24.5.2  更新已有的项 679

24.5.3  删除已有的项 679

24.6  使用LINQ to XML编程 680

24.6.1  作为更好的DOM的

       LINQ to XML 680

24.6.2  System.Xml.XLinq名称空间 680

24.7  Visual Basic 2008的集成

      XML支持 681

24.7.1  在String数据类型

       中存储XML字面值 682

24.7.2  在XML字面值中混合

       编程构造 682

24.8  以编程方式创建XML元素 683

24.9  以编程方式创建XML文档 684

24.10  通过LINQ查询生成文档 686

24.11  加载和解析XML内容 687

24.12  定位内存中的XML文档 688

24.12.1  修改XML文档中的数据 689

24.12.2  XML轴属性的作用 690

24.13  小结 692

第25章  Windows通信基础 693

25.1  综合介绍分布式计算API 693

25.1.1  DCOM的作用 694

25.1.2  COM+/Enterprise Service

       的作用 694

25.1.3  MSMQ的作用 695

25.1.4  .NET Remoting的作用 695

25.1.5  XML Web服务的作用 696

25.1.6  命名管道、套接字和P2P 698

25.2  WCF的作用 699

25.2.1  WCF特性概述 699

25.2.2  面向服务体系结构概述 700

25.2.3  WCF概要 700

25.3  研究核心WCF程序集 701

25.4  Visual Studio WCF项目模板 702

25.5  WCF应用程序的基本

      组成部分 703

25.6  WCF的ABC 704

25.6.1  理解WCF契约 705

25.6.2  理解WCF绑定 705

25.6.3  理解WCF地址 708

25.7  构建WCF服务 709

25.7.1  <ServiceContract()>属性 710

25.7.2  <OperationContract()>属性 711

25.7.3  作为可操作契约的服务类型 711

25.8  驻留WCF服务 712

25.8.1  在App.config文件中

       建立ABC 712

25.8.2  针对ServiceHost类型编码 713

25.8.3  主机编码选项 714

25.8.4  ServiceHost类型的细节 715

25.8.5  <system.serviceModel>

       元素的细节 716

25.8.6  启用元数据交换 717

25.9  构建WCF客户应用程序 719

25.9.1  使用svcutil.exe生成

       代理代码 719

25.9.2  使用Visual Studio 2008

       生成代理代码 720

25.10  使用WCF Service Library

       项目模板 721

25.10.1  构建简单的数学服务 721

25.10.2  使用WcfTestClient.exe

        测试WCF服务 722

25.10.3  使用SvcConfigEditor.exe

        修改配置文件 722

25.11  作为Windows服务驻留

       WCF服务 723

25.11.1  在代码中指定ABC 724

25.11.2  启用MEX 725

25.11.3  创建Windows服务

        安装程序 726

25.11.4  安装Windows服务 726

25.12  异步调用服务 727

25.13  设计WCF数据契约 729

25.13.1  使用以Web为中心的

        WCF Service项目模板 729

25.13.2  实现服务契约 731

25.13.3  *.svc文件的作用 732

25.13.4  更新web.config文件 732

25.13.5  测试服务 733

25.14  小结 734

第26章  Windows工作流基础 735

26.1  定义业务过程 735

26.2  WF的构件 736

26.2.1  WF运行时引擎 737

26.2.2  WF的核心服务 737

26.2.3  WF活动简介 738

26.2.4  顺序和状态机工作流 739

26.3  WF的程序集、

      名称空间和项目 741

26.3.1  .NET 3.5 WF支持 741

26.3.2  Visual Studio工作流

       项目模板 741

26.3.3  深入了解工作流的流程 742

26.4  构建允许工作流的简单

      应用程序 742

26.4.1  研究初始的工作流代码 743

26.4.2  添加Code活动 743

26.4.3  添加While活动 744

26.5  研究WF引擎宿主代码 746

26.6  在工作流中调用Web服务 749

26.6.1  创建MathWebService 750

26.6.2  构建WF Web服务使用者 751

26.6.3  配置IfElse活动 753

26.6.4  配置InvokeWebService活动 755

26.6.5  与WCF服务通信 757

26.7  构建可重用的WF代码库 760

26.7.1  执行信用检查 761

26.7.2  创建Windows Forms

       客户应用程序 763

26.8  自定义活动概述 765

26.9  小结 766

第VI部分  使用Windows Forms

        创建桌面应用程序

第27章  Windows Forms 769

27.1  System.Windows.Forms

     名称空间概述 769

27.2  使用Windows Forms类型 771

27.2.1  手动创建主窗口 771

27.2.2  遵守关注点分离 772

27.3  Application类的功能 773

27.3.1  使用Application类 773

27.3.2  System.EventHandler委托 774

27.4  窗体分析 775

27.5  Control类的功能 776

27.5.1  使用Control类 778

27.5.2  响应MouseMove事件 779

27.5.3  确定单击的鼠标键 780

27.5.4  响应键盘事件 780

27.6  Form类的功能 781

27.7  用Visual Studio 2008

      构建Windows应用程序 784

27.7.1  剖析Visual Studio 2008

       的Windows Forms项目 785

27.7.2  在设计时实现事件 787

27.7.3  StartUp Object/Main() Sub

       区别 788

27.8  使用MenuStrip和

      ContextMenuStrip 789

27.8.1  给MenuStrip添加文本框 790

27.8.2  创建上下文菜单 791

27.8.3  选中菜单项 793

27.9  使用StatusStrip 795

27.9.1  设计菜单系统 796

27.9.2  设计StatusStrip 797

27.9.3  使用Timer类型 798

27.9.4  触发显示 799

27.9.5  显示菜单选择提示 800

27.9.6  构建“就绪”状态 800

27.10  使用ToolStrip 801

27.11  构建MDI应用程序 804

27.11.1  构建父窗体 805

27.11.2  构建子窗体 806

27.11.3  产生子窗口 806

27.12  小结 807

第28章  使用GDI+呈现图形数据 808

28.1  GDI+名称空间概述 808

28.2  System.Drawing名称

      空间概述 809

28.3  System.Drawing的

      实用程序类型 810

28.3.1  Point和PointF类型 810

28.3.2  Rectangle和RectangleF类型 811

28.3.3  Region、Size和SizeF类 811

28.4  理解Graphics类 812

28.5  理解Paint会话 813

28.5.1  使窗体的客户区失效 814

28.5.2  在Paint事件处理程序

       之外获取Graphics对象 815

28.5.3  关于Graphics对象的处理 816

28.6  GDI+坐标系统 817

28.6.1  默认的量度单位 818

28.6.2  指定替代的量度单位 818

28.6.3  指定替代的圆点 819

28.7  定义颜色值 821

28.8  操作字体 822

28.8.1  使用字体家族 823

28.8.2  使用字体和字体大小 824

28.8.3  列举安装的字体 826

28.8.4  FontDialog类 828

28.9  System.Drawing.Drawing2D

      名称空间概述 829

28.10  使用 Pen 829

28.11  使用Brush 833

28.11.1  使用HatchBrush 834

28.11.2  使用TextureBrush 835

28.11.3  使用LinearGradientBrush 836

28.12  呈现图像 837

28.13  PictureBox控件的拖动

       和命中测试 839

28.13.1  呈现图像的命中测试 841

28.13.2  非矩形图像的命中测试 843

28.14  理解Windows Forms

       资源格式 845

28.14.1  System.Resources

        名称空间 846

28.14.2  以编程的方式创建

        *.resx文件 846

28.14.3  构建*.resources文件 847

28.14.4  将*.resources文件绑定

        到.NET程序集中 848

28.14.5  使用ResourceWriters 848

28.14.6  使用Visual Studio 2008

        生成资源 849

28.14.7  以编程的方式读取资源 850

28.15  小结 851

第29章  使用Windows Forms

         控件编程 852

29.1  Windows Forms控件概述 852

29.2  手动给窗体添加控件 852

29.3  使用Visual Studio 2008

      添加控件到窗体 855

29.4  使用基础控件 856

29.4.1  使用Label 856

29.4.2  使用TextBox 857

29.4.3  使用MaskedTextBox 859

29.4.4  使用Button 860

29.4.5  使用CheckBox、RadioButton

       和GroupBox 862

29.4.6  使用CheckedListBox 865

29.4.7  使用ListBox 866

29.4.8  使用ComboBox 867

29.5  配置制表符顺序 868

29.6  设置窗体的默认输入按钮 869

29.7  使用较为特殊的控件 869

29.7.1  使用MonthCalendar 869

29.7.2  使用ToolTip 871

29.7.3  使用TabControl 872

29.7.4  使用TrackBar 873

29.7.5  使用Panel 875

29.7.6  使用UpDown控件 876

29.7.7  使用ErrorProvider 878

29.7.8  使用TreeView 880

29.7.9  使用WebBrowser 884

29.8  构建自定义Windows Forms

      控件 885

29.8.1  创建图像 886

29.8.2  构建设计时GUI 886

29.8.3  实现核心CarControl 886

29.8.4  定义自定义事件 888

29.8.5  定义自定义特性 888

29.8.6  控制动画 889

29.8.7  呈现昵称 889

29.9  测试CarControl类型 890

29.10  构建自定义CarControl

       主窗体 890

29.11  System.ComponentModel

       名称空间的功能 892

29.11.1  增强CarControl的

        设计时显示 892

29.11.2  定义默认特性和默认事件 893

29.11.3  指定自定义工具箱位图 894

29.12  构建自定义对话框 895

29.12.1  DialogResult特性 896

29.12.2  理解窗体继承 897

29.13  动态定位Windows 

       Forms控件 899

29.13.1  Anchor特性 899

29.13.2  Dock特性 900

29.13.3  表和流程布局 901

29.14  小结 902

第VII部分  使用WPF创建桌面应用程序

第30章  WPF和XAML 905

30.1  WPF的动机 905

30.1.1  统一不同的API 906

30.1.2  通过XAML提供

       关注点分离 906

30.1.3  提供最佳渲染模型 907

30.1.4  其他以WPF为中心的

       特殊性能 907

30.2  各种类型的WPF应用程序 908

30.2.1  传统桌面应用程序 908

30.2.2  基于导航的WPF应用程序 908

30.2.3  XBAP应用程序 909

30.2.4  Silverlight应用程序 910

30.3  研究WPF程序集 910

30.3.1  Application类的功能 911

30.3.2  Window类的功能 912

30.4  构建(XAML-Free)WPF

      应用程序 916

30.4.1  扩展Window类的类型 918

30.4.2  创建一个简单的用户界面 919

30.5  Application类型的其他细节 920

30.5.1  应用程序范围数据和处理

       命令行实参 920

30.5.2  Application的Windows

       集合的迭代 921

30.5.3  Application类型的其他事件 921

30.6  Window类型的其他细节 922

30.6.1  Window对象的生存期 922

30.6.2  处理Window对象的关闭 923

30.6.3  处理窗口级的鼠标事件 924

30.6.4  处理窗口级的键盘事件 925

30.6.5  构建(以XAML为中心)

       WPF应用程序 925

30.6.6  在XAML中定义

       MainWindow 926

30.6.7  在XAML中定义

       Application对象 927

30.6.8  通过msbuild.exe

       处理XAML文件 928

30.7  将标记转换成.NET程序集 930

30.7.1  映射XAML到VB代码 930

30.7.2  BAML的功能 931

30.7.3  针对程序集的XAML

       处理小结 932

30.8  使用代码分离文件的

      关注点分离 933

30.9  XAML的语法 935

30.9.1  XAML名称空间和

       XAML关键字 935

30.9.2  XAML元素和XAML属性 937

30.9.3  理解XAML属性元素语法 938

30.9.4  理解XAML附加特性 940

30.9.5  理解XAML类型转换器 941

30.9.6  理解XAML标记扩展 941

30.9.7  资源和数据绑定预览 943

30.10  使用Visual Studio 2008

       构建WPF应用程序 945

30.10.1  WPF项目模板 945

30.10.2  改变初始窗口的名称 945

30.10.3  WPF设计器 946

30.11  在运行库中处理XAML:

       SimpleXamlPad.exe 948

30.11.1  实现Loaded事件 949

30.11.2  实现Button的Click事件 950

30.11.3  实现Closed事件 951

30.11.4  测试应用程序 951

30.12  Microsoft Expression Blend

       的功能 952

30.13  小结 953

第31章  使用WPF控件编程 954

31.1  WPF控件库概述 954

31.1.1  WPF控件和

       Visual Studio 2008 955

31.1.2  文档中的细节 955

31.2  在XAML中声明控件 956

31.3  理解依赖属性的功能 958

31.3.1  研究现有的依赖属性 959

31.3.2  注册依赖属性 960

31.3.3  为DependencyProperty

       字段定义封装器特性 961

31.4  理解路由事件 962

31.4.1  路由冒泡事件的功能 963

31.4.2  继续或者停止冒泡 964

31.4.3  路由隧道事件的功能 964

31.5  使用Button类型 966

31.5.1  ButtonBase类型 966

31.5.2  Button类型 967

31.5.3  ToggleButton类型 967

31.5.4  RepeatButton类型 968

31.6  使用CheckBoxes和

      RadioButtons 969

31.6.1  建立逻辑群 970

31.6.2  构架GroupBox中的

       相关元素 971

31.6.3  构架Expander中的

       相关元素 971

31.7  使用ListBox和

      ComboBox类型 972

31.7.1  以编程的方式填充List控件 973

31.7.2  添加专用内容 974

31.7.3  确定当前选择 975

31.7.4  确定内嵌内容的当前选择 976

31.8  使用文本区域 977

31.8.1  使用TextBox类型 977

31.8.2  使用PasswordBox类型 978

31.9  使用窗格控制内容布局 979

31.9.1  WPF的核心窗格类型 980

31.9.2  在Canvas窗格内定位内容 981

31.9.3  在WrapPanel窗格内

       定位内容 983

31.9.4  在StackPanel窗格内

       定位内容 984

31.9.5  在Grid窗格内定位内容 985

31.9.6  在DockPanel窗格内

       定位内容 987

31.9.7  启用Panel类型的滚动行为 987

31.10  使用内嵌窗格构建

       窗口的构架 988

31.10.1  构建菜单系统 989

31.10.2  构建工具栏 990

31.10.3  构建状态条 991

31.10.4  结束UI设计 991

31.10.5  结束实现 992

31.11  理解WPF控件命令 993

31.11.1  内部控件命令对象 993

31.11.2  连接命令到命令特性 994

31.11.3  连接命令到专用UI元素 995

31.12  理解WPF数据绑定模型 996

31.12.1  初观数据绑定 997

31.12.2  DataContext特性 998

31.12.3  Mode特性 998

31.13  使用IValueConverter的

       数据转换 999

31.14  绑定自定义对象 1001

31.14.1  使用Observable

        Collection(Of T)类型 1003

31.14.2  创建自定义数据模板 1004

31.15  绑定UI元素到XML文档 1005

31.15.1  构建自定义对话框 1006

31.15.2  分配DialogResult值 1007

31.15.3  获得当前选择 1008

31.15.4  显示自定义对话框 1008

31.16  小结 1009

第32章  WPF二维图形渲染、资源

         和主题 1010

32.1  WPF图形渲染服务哲学 1010

32.1.1  WPF图形渲染选项 1011

32.1.2  选择合适的方法 1016

32.2  探索Shape派生类型 1016

32.3  使用WPF画笔 1019

32.3.1  用单色构建画笔 1019

32.3.2  使用渐变画笔 1020

32.3.3  ImageBrush类型 1021

32.4  使用WPF笔 1021

32.5  探索Drawing派生类型 1022

32.5.1  几何类型的功能 1022

32.5.2  剖析简单的绘制几何 1023

32.5.3  DrawingImage包含的

       Drawing类型 1024

32.5.4  DrawingBrush中包含的

       Drawing类型 1024

32.5.5  更加复杂的Drawing几何 1025

32.6  UI转换的功能 1026

32.6.1  Transform派生类型 1026

32.6.2  应用转换 1027

32.7  理解WPF的动画服务 1028

32.7.1  Animation后缀类型的功能 1028

32.7.2  Timeline基类的功能 1029

32.7.3  在VB代码中编写动画 1029

32.7.4  控制动画的调步 1031

32.7.5  反向和循环动画 1031

32.7.6  在XAML中编写动画 1032

32.7.7  Animation关键帧的功能 1033

32.8  理解WPF资源系统 1036

32.8.1  使用二进制资源 1036

32.8.2  对象(又称为逻辑)资源

       的功能 1037

32.9  为WPF控件定义并

      应用样式 1037

32.9.1  使用内联样式 1038

32.9.2  使用命名样式 1039

32.9.3  重写样式设置 1040

32.9.4  使现有样式成为子类 1040

32.9.5  扩展样式 1041

32.9.6  收缩样式 1042

32.9.7  隐式地分配样式 1042

32.9.8  用触发器定义样式 1042

32.9.9  以编程的方式分配样式 1044

32.10  使用模板更改控件的UI 1045

32.10.1  构建自定义模板 1046

32.10.2  添加触发器到模板 1047

32.10.3  合并模板到样式中 1048

32.11  小结 1050

第VIII部分  用ASP.NET构建

          Web应用程序

第33章  构建ASP.NET Web页面 1053

33.1  HTTP的功能 1053

33.1.1  HTTP请求/响应循环 1053

33.1.2  HTTP是一种无状态协议 1054

33.2  理解Web应用程序和

      Web服务器 1054

33.2.1  IIS虚拟的功能 1055

33.2.2  ASP.NET开发服务器 1056

33.3  HTTP的功能 1057

33.3.1  HTML文档结构 1057

33.3.2  HTML窗体开发 1058

33.3.3  构建基于HTML的

       用户界面 1059

33.4  客户端脚本的功能 1061

33.4.1  客户端脚本示例 1062

33.4.2  验证default.htm窗体数据 1062

33.5  提交窗体数据(获取和提交) 1063

33.6  构建传统ASP页面 1063

33.7  传统ASP的问题 1065

33.7.1  ASP.NET 1.x的主要优点 1065

33.7.2  ASP.NET 2.0的主要改进 1066

33.7.3  主要的ASP.NET 3.5 Web

       的改进 1066

33.8  ASP.NET名称空间 1066

33.9  ASP.NET Web页面

      代码模型 1067

33.9.1  构建以数据为中心的

       单文件测试页面 1068

33.9.2  使用代码分离页面模型 1073

33.10  ASP.NET网站

       结构细节 1076

33.10.1  引用程序集 1076

33.10.2  App_Code文件夹

        的功能 1077

33.11  ASP.NET页面编译周期 1077

33.11.1  单文件页面的编译周期 1078

33.11.2  多文件页面的编译周期 1078

33.12  页面类型的继承链 1080

33.13  与入站HTTP请求进行

       互操作 1081

33.13.1  获得浏览器统计数据 1082

33.13.2  访问引入的窗体数据 1082

33.13.3  IsPostBack特性 1083

33.14  与出站HTTP响应进行

       互操作 1084

33.14 1  发送HTML内容 1084

33.14.2  重定向用户 1085

33.15  ASP.NET Web页面的

       生命周期 1085

33.15.1  AutoEventWireup

        属性的功能 1087

33.15.2  Error事件 1088

33.16  web.config文件的功能 1089

33.17  小结 1091

第34章  ASP.NET Web控件、主题

         和Master页面 1092

34.1  理解Web控件的实质 1092

34.1.1  限定服务器端的事件处理 1093

34.1.2  AutoPostBack特性 1093

34.1.3  System.Web.UI.Control

       类型 1094

34.1.4  枚举已包含的控件 1095

34.1.5  动态添加(或者移除)控件 1096

34.2  System.Web.UI.WebControls

      .WebControl类型的关键成员 1097

34.3  ASP.NET Web控件的类别 1098

34.4  构建ASP.NET网站 1099

34.4.1  使用Master页面 1100

34.4.2  定义Default.aspx内容页面 1105

34.4.3  设计内容页面 1106

34.4.4  设计Build-a-Car内容页面 1110

34.5  验证控件的功能 1111

34.5.1  RequiredFieldValidator 1113

34.5.2  RegularExpressionValidator 1113

34.5.3  RangeValidator 1114

34.5.4  CompareValidator 1114

34.5.5  创建验证小结 1115

34.6  使用主题 1115

34.6.1  理解*.skin文件 1116

34.6.2  应用站点范围的主题 1117

34.6.3  在页面级应用主题 1118

34.6.4  SkinID特性 1118

34.6.5  以编程的方式分配主题 1119

34.7  小结 1120

第35章  ASP.NET状态管理技术 1122

35.1  发布状态 1122

35.2  ASP.NET状态管理技术 1124

35.3  理解ASP.NET查看状态

      的功能 1124

35.3.1  示范查看状态 1125

35.3.2  添加自定义查看状态数据 1126

35.3.3  关于控件状态的简述 1127

35.4  Global.asax文件的功能 1127

35.4.1  全局最后机会异常事件

       处理程序 1129

35.4.2  HttpApplication基类 1129

35.5  理解应用程序/会话的区别 1130

35.5.1  维护应用程序级状态数据 1130

35.5.2  修改应用程序数据 1133

35.5.3  处理Web应用程序的关闭 1133

35.6  使用应用程序缓存 1134

35.6.1  使用数据缓存 1134

35.6.2  修改*.aspx文件 1137

35.7  维护会话数据 1138

35.7.1  其他HttpSessionState成员 1140

35.7.2  理解Cookie 1141

35.7.3  创建Cookie 1142

35.7.4  读取引入的Cookie数据 1143

35.8  <sessionState>元素的功能 1144

35.8.1  在ASP.NET会话状态

       服务器上存储会话数据 1144

35.8.2  在专用数据库中存储

       会话数据 1145

35.9  理解ASP.NET配置文件

      API 1146

35.9.1  ASPNETDB数据库 1146

35.9.2  在web.config中定义

       用户配置文件 1147

35.9.3  以编程的方式访问配置

       文件数据 1148

35.9.4  分组配置文件数据并

       保留自定义对象 1151

35.10  小结 1152

  

  

  

  

  

  

  

  

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个