内容简介
C#经典名著!也是Wrox红皮书中最畅销的品种之一,从第一版开始就名满天下;其第3版被中华读书报、CSDN、《程序员》等机构评选为2005年最权威的十大IT图书之一(第2名);在中国版协、中国出版科学研究所、《出版参考》杂志组织的“2005年度输出版、引进版优秀图书”评选活动中获得“2005年度引进版科技类优秀图书”奖。第4版面向C# 2005,在全面展示.NET新特性的同时继续完善原有的内容,是有一些C#基础知识的学习者或者想迁移到C#的其他程序员全面掌握C#的首选教程。
C#和.NET全面革新了编写程序的方式。本书以最新的.NET Framework 2.0和Visual Studio 2005为基础,全面介绍了C#编程的工具,提供了理解.NET体系结构的工作原理所必需的背景知识。
对于开发人员来说,把C#语言及其相关环境.NET Framework描述为多年来最重要的新技术一点都不夸张。.NET提供了一种新环境。在这个环境中,可以开发出运行在Windows上的几乎所有应用程序,而C#是专门用于.NET的新编程语言。例如,使用C#可以编写出动态Web页面、XML Web服务、分布式应用程序的组件、数据库访问组件、传统的Windows桌面应用程序,甚或可以联机/脱机运行的新型智能客户应用程序。本书介绍.NET Framework 2.0,即.NET Framework的第3版。如果读者使用1.0或1.1版本编码,本书的一些章节就不适用。本书将标注出只适用于.NET Framework 2.0的新增内容。 不要被.NET这个名称所愚弄,这个名称仅强调Microsoft相信分布式应用程序是未来的趋势,即处理过程分布在客户机和服务器上,但C#不仅仅是编写Internet或与网络相关的应用程序的一种语言,它还提供了一种编写Windows平台上几乎任何类型的软件或组件的方式。另外,C#和.NET都对编写程序的方式进行了革新,更易于实现在Windows上编程。 这是一个相当重要的声明。毕竟,我们都知道计算机技术的发展速度非常快,每年Microsoft都会推出新软件、新的编程工具或Windows的新版本,并宣称这些对开发人员都非常有用,.NET和C#也不例外。 .NET和C#的重要性 为了理解.NET的重要性,考虑一下近10年来出现的许多Windows技术的本质会有一定的帮助。尽管所有的Windows操作系统在表面上看来完全不同,但从Windows 3.1(1992年)到Windows Server 2003,在内核上都有相同的Windows API。在我们转而使用Windows的新版本时,API中增加了非常多的新功能,但这是一个演化和扩展API的过程,并非替换它。 开发Windows软件所使用的许多技术和架构也是这样。例如,COM(Component Object Model,组件对象模型)是作为OLE(Object Linking and Embedding,对象链接和嵌入)开发出来的,那时,它在很大程度上仅是把不同类型的办公文档链接在一起,所以利用它可以把一个小Excel电子表格放在Word文档中。之后,它逐步演化为COM、DCOM(Distributed COM,分布式组件对象模型)和最终的COM+。COM+是一种复杂的技术,它是几乎所有组件通信方式的基础,实现了事务处理、消息传输服务和对象池。 Microsoft选择这条道路的原因非常明显:它关注向后的兼容性。在过去的这些年中,第三方厂商编写了相当多的Windows软件,如果Microsoft每次都引入一项不遵循现有编码规则的新技术,Windows就不会获得今天的成功。 向后兼容性是Windows技术的极其重要的特性,也是Windows平台的一个长处。但它有一个很大的缺点:每次某项技术进行演化,增加了新功能后,都会比它以前更复杂。 很明显,对此必须进行改进。Microsoft不可能一直扩展这些开发工具和语言,使它们越来越复杂,既要保证能跟上最新硬件的发展步伐,又要与20世纪90年代初开始流行的Windows产品向后兼容。如果要得到一种简单而专业化的语言、环境和开发工具,让开发人员轻松地编写优秀的软件,就需要一种新的开端。 这就是C#和.NET的作用。粗略地说,.NET是一种在Windows平台上编程的新架构—— 一种新API。C#是一种全新的语言,它可以利用.NET Framework及其开发环境中的所有新特性,以及在最近20年来出现的面向对象的编程方法。 在继续介绍前,必须先说明,向后兼容性并没有在这个演化进程中失去。现有的程序仍可以使用,.NET也兼容现有的软件。软件组件在Windows上的通信,现在几乎都是使用COM实现的。因此,.NET能够提供现有COM组件的包装器(wrapper),以便.NET组件与之通信。 我们不需要学习了C#才能给.NET编写代码,因为Microsoft已经扩展了C++,提供了一种新语言J#,还对Visual Baisc进行了很多改进,把它转变成为功能更强大的Visual Baisc.NET,并允许把用这些语言编写的代码用于.NET环境。但这些语言都因有多年演化的痕迹,所以不能完全用现在的技术来编写。 本书将介绍C#编程技术,同时提供.NET体系结构工作原理的必要背景知识。我们不仅会介绍C#语言的基础,还会给出使用各种相关技术的应用程序示例,包括数据库访问、动态的Web页面、先进的图形技术和目录访问等。惟一的要求是用户至少熟悉一门在Windows上使用的高级语言,例如C++、Visual Baisc或J++。 .NET的优点 前面阐述了.NET的优点,但并没有说它会使开发人员的工作更易完成。本节将简要讨论.NET的改进特性。 ● 面向对象的编程:.NET Framework和C#从一开始就完全是基于面向对象的。 ● 优秀的设计:一个基类库,它是以一种非常直观的方式设计出来的。 ● 语言的无关性:在.NET中,Visual Baisc.NET、C#、J#和Managed C++等语言都可以编译为通用的中间语言(Intermediate Language)。这说明,语言可以用以前没有的方式交互操作。 ● 对动态Web页面的更好支持:ASP具有很大的灵活性,但效率不是很高,这是因为它使用了解释性的脚本语言,且缺乏面向对象的设计,从而导致ASP代码比较凌乱。.NET使用一种新技术ASP.NET,它为Web页面提供了一种集成式的支持。使用ASP.NET,可以编译页面中的代码,这些代码还可以使用.NET高级语言来编写,例如C#、J#或Visual Baisc 2005。 ● 高效的数据访问:一组.NET组件,总称为ADO.NET,提供了对关系数据库和各种数据源的高效访问。这些组件也可以访问文件系统和目录。.NET内置了XML支持,可以处理从非Windows平台导入或导出的数据。 ● 代码共享:.NET引入了程序集的概念,替代了传统的DLL,可以完美无暇地修补代码在应用程序之间的共享方式。程序集是解决版本冲突的正式系统,程序集的不同版本可以同时存在。 ● 增强的安全性:每个程序集还可以包含内置的安全信息,这些信息可以准确地指出谁或哪种类型的用户或进程可以调用什么类的哪些方法。这样就可以非常准确地控制程序集的使用方式。 ● 对安装没有任何影响:有两种类型的程序集,分别是共享程序集和私有程序集。共享程序集是可用于所有软件的公共库,私有程序集只用于某个软件。私有程序集是完全自包含的,所以安装过程非常简单,没有注册表项,只需把相应的文件放在文件系统的相应文件夹中即可。 ● Web服务的支持:.NET集成了对开发Web服务的完全支持,用户可以开发出任何类型的应用程序。 ● Visual Studio 2005:.NET附带了一个开发环境Visual Studio 2005,它可以很好地利用C++、C#、J#、Visual Baisc 2005和ASP.NET进行编码。Visual Studio 2005集成了Visual Studio .NET 2002/2003和Visual Studio 6环境中的各种语言专用的所有最佳功能。 ● C#:是使用.NET的一种面向对象的新语言。 第1章将详细讨论.NET体系结构的优点。 .NET Framework 2.0中的新增特性 .NET Framework的第1版(1.0版)在2002年发布,赢得了许多人的喝彩。.NET Framework的最新版本2.0在2005年发布,它被认为是对该架构进行了较大的改进。 Microsoft每次发布新的架构时,总是试图确保对已开发出的代码进行尽可能少的修改。到目前为止,Microsoft在这方面做得很成功。 注意: 一定要建立一个临时的服务器,来测试应用程序到.NET Framework 2.0的升级,而不是直接升级当前运行的应用程序。 下面将详细描述.NET Framework 2.0中的一些新变化,以及.NET Framework 2.0的开发环境——Visual Studio 2005的新增内容。 SQL Server集成 经过漫长的等待,SQL Server的最新版本终于发布了。这个版本是SQL Server 2005,在许多方面都比较独特。对.NET开发人员来说,最重要的是SQL Server 2005现在包含了CLR。Microsoft为开发人员开发的.NET产品,能把.NET Framework 2.0、Visual Studio 2005和SQL Server 2005关联在一起,所以,这三个产品现在是一起发布的。这是相当重要的,因为以前建立的大多数应用程序都使用这三个产品,它们需要一块儿升级,以无缝的方式交互操作。 因为SQL Server 2005现在包含了CLR,所以现在不需要使用T-SQL编程语言建立应用程序的数据库功能,而可以用任意.NET兼容语言,如C#,建立各种对象,如存储过程、触发器,甚至数据类型。 SQL Server Express是SQL Server中替代MSDE的2005版本。这个版本没有MSDE那样严格的限制。 64位支持 目前的大多数编程都在32位的机器上进行。在应用程序的开发过程中,计算机从16位升级到32位是一个质的飞跃。越来越多的企业开始迁移到Intel (Itanium芯片)和AMD (x64芯片)等公司的最新最大的64位服务器上,.NET Framework 2.0现在就支持这种64位大迁移。 Microsoft努力确保在.NET的32位环境中开发的所有代码都可以在64位环境下运行。也就是说,用SQL Server 2005或ASP.NET开发的所有代码迁移到64位服务器上后,其运行不受影响。Microsoft也对CLR做了许多改进,使.NET的64位版本能正常工作。这些改进包括垃圾回收(处理更多的数据)、JIT编译过程、异常处理等。 迁移到64位后,会增加一些强大的功能。最重要也是最明显的原因是64位服务器有更大的寻址空间。迁移到64位还可以有更大的基本数据类型。例如,2^32的整数值是4,294,967,296,而2^64的整数值是18,446,744,073,709,551,616。应用程序将更便于计算U.S.债务或其他很大的数字。 Microsoft和IBM等公司给客户展示了64位的魅力。一个主要领域就是数据库和虚拟数据存储功能,这是迁移到64位的一个最有意义的理由。 Visual Studio 2005可以在64位计算机上安装和运行。这个IDE有32位和64位编译器。其后果之一是,64位的.NET Framework只能用于Windows Server 2003 SP1或更高版本,以及将来的其他64位Microsoft操作系统。 在Visual Studio 2005中建立应用程序时,可以修改应用程序的建立属性,使之专门为64位计算机编译程序。要找到这个设置,需要打开应用程序的属性窗口,单击Properties页面上的Build选项卡。在Build页面上单击Advanced按钮,打开Advanced Compiler Setting对话框。在这个对话框中,可以修改底部的目标CPU。这样,就可以使所建立的应用程序用于Intel 64位计算机或AMD 64位计算机,如图0-1所示。 图0-1 为64位计算机创建应用程序 泛型 为了使集合的功能更强大,也为了提高它们的效率和可用性,.NET Framework 2.0引入了泛型。泛型引入到底层的架构上,这意味着C#和Visual Basic 2005等语言现在可以建立使用泛型类型的应用程序了。泛型概念并不是新内容,它们类似于C++的模板,但有些区别。其他语言中也有泛型,例如Java。把它们引入.NET Framework 2.0将给用户带来巨大的实惠。 泛型可以使一般的集合仍是强类型化的—— 出错的几率更小(因为错误在运行期间发生),提高性能,在使用集合时将可以使用Intellisense特性。 要在代码中使用泛型,需要引用System.Collections.Generic命名空间,该命名空间还允许访问Stack、Dictionary、SortedDictionary、List和Queue类的泛型版本。下面演示了Stack类的泛型版本: void Page_Load(object sender, EventArgs e) { System.Collections.Generic.Stack myStack = New System.Collections.Generic.Stack(); myStack.Push("St. Louis Rams"); myStack.Push("Indianapolis Colts"); myStack.Push("Minnesota Vikings"); Array myArray; myArray = myStack.ToArray(); foreach(string item in myArray) { Label1.Text += item + ""; } } 在上面的例子中,Stack类显式转换为string类型。这里用括号指定集合类型。这个例子使用Stack把Stack类转换为string类型。如果要把它转换为不是string类型的Stack类,例如int,就可以指定Stack。 在创建Stack类时,Stack类中的项集合就转换为指定的类型,所以Stack类不再把项集合转换为object类型,以后(在foreach循环中)再转换为string类型。这个过程称为装箱,该过程是很昂贵的。因为这段代码事先指定了类型,所以使用集合的性能提高了。 泛型除了用于处理集合类型之外,还可以用于处理类、委托、方法等。本书的第10章将详细介绍泛型。 匿名方法 匿名方法可以把编程步骤放在一个委托中,以后再执行该委托,而不是创建全新的方法。例如,如果不使用匿名方法,就要以下面的方式使用委托: public partial class Default_aspx { void Page_Load(object sender, EventArgs e) { this.Button1.Click += ButtonWork; } void ButtonWork(object sender, EventArgs e) { Label1.Text = "You clicked the button!"; } } 但若使用匿名方法,就可以把这些操作直接放在委托中,如下面的例子所示: public partial class Default_aspx { void Page_Load(object sender, EventArgs e) { this.Button1.Click += delegate(object myDelSender, EventArgs myDelEventArgs) { Label1.Text = "You clicked the button!"; }; } } 在使用匿名方法时,不需要创建另一个方法,而是把需要的代码直接放在委托声明的后面。委托执行的语句和步骤放在花括号中,用一个分号结束。 可空类型 由于泛型引入到底层的.NET Framework 2.0中,所以现在可以使用System.Nullable创建可空的值类型。这非常适合于创建int类型的可空项集合。而在此之前,很难创建包含空值的int,或者把空值赋予int。 要创建int类型的可空类型,可以使用下面的语法: System.Nullable x = new System.Nullable; 有一个新的类型修饰符,可用于创建可空类型,如下面的例子所示: int? salary = 800000 创建可空类型的功能不仅可在C#中使用,因为该功能内置于.NET Framework,而这要归功于.NET中的新泛型功能。所以,也可以在Visual Basic 2005中使用可空类型。 迭代器 迭代器允许在自己的定制类型中使用foreach循环。为此,需要使类实现IEnumerable接口,如下所示: using System; using Systm.Collections; public class myList { internal object[] elements; internal int count; public IEnumerator GetEnumerator() { yield return "St. Louis Rams"; yield return "Indianapolis Colts"; yield return "Minnesota Vikiings"; } } 要使用IEnumerator接口,需要引用System.Collections命名空间。有了该命名空间,就可以迭代定制类了,如下所示: void Page_Load(object sender, EventArgs e) { myList IteratorList = new myList(); foreach(string item in IteratorList) { Response.Write(item.ToString() + ""); } } 部分类 部分类是.NET Framework 2.0的一个新功能,C#也充分利用了这一功能。部分类可以把单个类分解到多个类文件中,以后在编译时再把这些文件合并起来。 要创建部分类,只需给要与另一个类合并起来的类使用partial关键字。在要与最初的类合并的类中,partial关键字放在class关键字的前面。例如,有一个简单的类Calculator,如下所示: public class Calculator { public int Add(int a, int b) { return a + b; } } 接着,创建第二个类,它要与第一个类关联起来,如下面的例子所示: public partial class Calculator { public int Subtract(int a, int b) { return a - b; } } 编译时,这些类会放在一个Calculator类实例中,就好像它们从一开始就放在一起一样。 C#的优点 C#在某种程度上可以看作是.NET面向Windows环境的一种编程语言。在过去的十几年中,Microsoft给Windows和 Windows API添加了许多功能,Visual Baisc 2005和C++也经历了许多变化。虽然Visual Baisc和C++最终已成为非常强大的语言,但这两种语言也存在问题,因为它们保留了原来的一些内容。 对于Visual Basic 6及其早期版本来说,它的主要优点是很容易理解,许多编程工作都很容易完成,基本上隐藏了Windows API和COM组件结构的内涵。其缺点是Visual Basic从来没有实现真正意义上的面向对象,所以大型应用程序很难分解和维护。另外,因为Visual Baisc的语法继承于BASIC的早期版本(BASIC主要是为了让初学者更容易理解,而不是为了编写大型商业应用程序),所以不能真正成为结构化或面向对象的编程语言。 另一方面,C++置根于ANSI C++语言定义。它与ANSI不完全兼容,因为Microsoft是在ANSI定义标准化之前编写C++编译器的,但已经相当接近了。遗憾的是,这导致了两个问题。其一,ANSI C++是在十几年前的技术条件下开发的,因此不支持现在的概念(例如Unicode字符串和生成XML文档),某些古老的语法结构是为以前的编译器设计的(例如成员函数的声明和定义是分开的)。其二,Microsoft同时还试图把C++演变为一种用于在Windows上执行高性能任务的语言,在语言中避免添加大量Microsoft专用的关键字和各种库。其结果是在Windows中,该语言成为了一种非常杂乱的语言。让C++开发人员说说字符串有多少种定义方式就可以说明这一点:char*、LPTSTR、string、CString (MFC 版本)、CString (WTL 版本)、wchar_t*和 OLECHAR*等。 现在进入.NET时代—— 一种全新的环境,它对这两种语言都进行了新的扩展。Microsoft给C++添加了许多Microsoft专用的关键字,并把Visual Baisc演变为Visual Baisc.NET,再演变为Visual Baisc 2005,保留了一些基本的Visual Baisc语法,但在设计上完全不同,从实际应用的角度来看,Visual Baisc 2005是一种新语言。 在这里,Microsoft决定给开发人员另一个选择—— 专门用于.NET、具有新起点的语言, 即Visual C# 2005。Microsoft在正式场合把C#描述为一种简单、现代、面向对象、类型非常安全、派生于C和C++的编程语言。大多数独立的评论员对其说法是“派生于C、 C++ 和Java”。这种描述在技术上是非常准确的,但没有涉及到该语言的真正优点。从语法上看,C#非常类似于C++和Java,许多关键字都是相同的,C#也使用类似于C++和Java的块结构,并用括号({})来标记代码块,用分号分隔各行语句。对C#代码的第一印象是它非常类似于C++或Java代码。但在这些表面上的类似性后面,C#学习起来要比C++容易得多,但比Java难一些。其设计与现代开发工具的适应性要比其他语言更高,它同时具有Visual Basic的易用性、高性能以及C++的低级内存访问性。C#包括以下一些特性: ● 完全支持类和面向对象编程,包括接口和继承、虚函数和运算符重载的处理。 ● 定义完整、一致的基本类型集。 ● 对自动生成XML文档说明的内置支持。 ● 自动清理动态分配的内存。 ● 可以用用户定义的特性来标记类或方法。这可以用于文档说明,对编译有一定的影响(例如,把方法标记为只在调试时编译)。 ● 对.NET基类库的完全访问权,并易于访问Windows API。 ● 可以使用指针和直接内存访问,但C#语言可以在没有它们的条件下访问内存。 ● 以Visual Baisc的风格支持属性和事件。 ● 改变编译器选项,可以把程序编译为可执行文件或.NET组件库,该组件库可以用与ActiveX控件(COM组件)相同的方式由其他代码调用。 ● C#可以用于编写ASP.NET动态Web页面和XML Web服务。 应该指出,对于上述大多数特性,Visual Baisc 2005和Managed C++也具备。但C#从一开始就使用.NET,对.NET特性的支持不仅是完整的,而且提供了比其他语言更合适的语法。C#语言本身非常类似于Java,但其中有一些改进,因为Java并不是为应用于.NET环境而设计的。 在结束这个主题前,还要指出C#的两个局限性。其一是该语言不适用于编写时间急迫或性能非常高的代码,例如一个要运行1000或1050次的循环,并在不需要这些循环时,立即清理它们所占用的资源。在这方面,C++可能仍是所有低级语言中的佼佼者。其二是C#缺乏性能极高的应用程序所需要的关键功能,包括保证在代码的特定地方运行的内联函数和析构函数。但这类应用程序非常少。 编写和运行C#代码需要的环境 .NET Framework运行在Windows 98、2000、XP和2003上。要使用.NET编写代码,需要安装.NET SDK,除非使用内置了.NET Framework 1.0和1.1的Windows Server 2003。如果要运行本书中的例子,应安装.NET Framework 2.0,即使运行Windows Server 2003,也要安装.NET Framework 2.0,因为.NET Framework 2.0在这个服务器上并不是默认安装选项。 除非要使用文本编辑器或其他第三方开发环境来编写C#代码,否则一般使用Visual Studio 2005。运行托管代码不需要安装完整的SDK,但需要.NET运行库。需要把.NET运行库分布到还没有安装它的客户机上。 本书内容 在本书中,首先在第1章介绍.NET的整体体系结构,给出编写托管代码所需要的背景知识,此后本书分几部分介绍C#语言及其C#语言在各个领域中的应用。 第Ⅰ部分(第1~13章)—— C#语言 本部分给出C#语言的背景知识。这一部分没有指定任何语言,但假定读者是有经验的编程人员。首先介绍 C#的基本语法和数据类型,再介绍C#的面向对象特性,之后是C#中的一些高级论题。 第Ⅱ部分(第14~18章)—— .NET环境 本部分介绍在.NET环境中的编程规则。特别是Visual Studio .NET、安全性、.NET应用程序的线程部署,以及把库生成为程序集的方式。 第Ⅲ部分(第19~22章)—— 数据 本部分介绍如何使用ADO.NET访问数据库,以及目录和Active Directory交互。我们还详细说明.NET对XML的支持、对Windows操作系统的支持,以及SQL Server 2005的.NET特性。 第Ⅳ部分(第23~25章)—— Windows应用程序 本部分讨论传统Windows应用程序的创建,在.NET中这种应用程序称为Windows窗体。Windows窗体是应用程序的胖客户版本,使用.NET创建这些类型的应用程序是实现该任务的一种快捷、简单的方式。除了介绍Windows窗体之外,我们还将论述GDI+,这种技术可用于创建包含高级图形的应用程序。 第Ⅴ部分(第26~27章)—— Web应用程序 这一部分介绍如何编写在网站上运行的组件,如何编写网页。其中包括ASP.NET 2.0提供的许多新特性。 第Ⅵ部分(第28~32章)——通信 这一部分介绍通信,主要论述独立于平台进行通信的Web服务、在.NET客户机和服务器之间通信的.NET Remoting技术、在后台上运行的Enterprise Services和DCOM通信。有了消息异步排队技术,可以进行断开连接的运行。“分布式编程的未来”一章可以让用户为当前的解决方案做出正确的通信选择。 第Ⅶ部分(第33章)—— 交互操作 COM的向后兼容性是.NET的一个重要组成部分,我们开发了太多的COM组件和应用程序。本部分将介绍如何在.NET应用程序中使用已有的COM组件,以及如何在COM应用程序中使用.NET组件。 第Ⅷ部分(第34~36章)—— Windows基本服务 本部分是本书主要内容的总结,介绍如何访问文件和注册表,如何通过应用程序访问Internet,以及如何使用Windows服务。 第Ⅸ部分—— 附录(本书仅提供内容下载地址) 本部分包含几个附录,详细介绍了面向对象的编程规则及C#编程语言专用的信息。这些附录在本书中并未给出,您可以通过本书提及的Web站点获得其PDF版本。 如何下载本书的示例代码 在读者学习本书中的示例时,可以手工输入所有的代码,也可以使用本书附带的源代码文件。本书使用的所有源代码都可以从本书合作站点/或www.tupwk.com.cn/downpage上下载。登录到站点/,使用Search工具或使用书名列表就可以找到本书。接着单击本书细目页面上的Download Code链接,就可以获得所有的源代码。 注释: 许多图书的书名都很相似,所以通过ISBN查找本书是最简单的,本书的ISBN是0-7645-7534-1。 在下载了代码后,只需用自己喜欢的解压缩软件对它进行解压缩即可。另外,也可以进入/dynamic/books/download.aspx上的Wrox代码下载主页,查看本书和其他Wrox图书的所有代码。 勘误表 尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果您在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。 请给fwkbook@tup.tsinghua.edu.cn发电子邮件,我们就会检查您的信息,如果是正确的,我们将在本书的后续版本中采用。 要在网站上找到本书的勘误表,可以登录,通过Search工具或书名列表查找本书,然后在本书的细目页面上,单击Book Errata链接。在这个页面上可以查看到Wrox编辑已提交和粘贴的所有勘误项。完整的图书列表还包括每本书的勘误表,网址是/misc-pages/booklist.shtml。 P2P邮件列表是为作者和读者之间的讨论而建立的。读者可以在上加入P2P论坛。该论坛是一个基于Web的系统,用于传送与Wrox图书相关的信息和相关技术,与其他读者和技术用户交流。该论坛提供了订阅功能,当论坛上有新贴子时,会给您发送您选择的主题。Wrox作者、编辑和其他业界专家和读者都会在这个论坛上进行讨论。 在上有许多不同的论坛,帮助读者阅读本书,在读者开发自己的应用程序时,也可以从这个论坛中获益。要加入这个论坛,需执行下面的步骤: (1) 进入,单击Register链接。 (2) 阅读其内容,单击Agree按钮。 (3) 提供加入论坛所需的信息及愿意提供的可选信息,单击Submit按钮。 然后就可以收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程。 提示: 不加入P2P也可以阅读论坛上的信息,但只有加入论坛后,才能发送自己的信息。 加入论坛后,就可以发送新信息,回应其他用户的贴子。可以随时在Web上阅读信息。如果希望某个论坛给自己发送新信息,可以在论坛列表中单击该论坛对应的Subscribe to this Forum图标。 对于如何使用Wrox P2P的更多信息,可阅读P2P FAQ,了解论坛软件的工作原理,以及许多针对P2P和Wrox图书的常见问题解答。要阅读FAQ,可以单击任意P2P页面上的FAQ链接。