图书前言

前    言

对于开发人员,把C#语言及其相关联的.NET Framework环境描述为最重要的新技术一点都不夸张。.NET提供了一种环境。在这个环境中,可以开发在Windows上运行的几乎所有应用程序,而C#是专门用于.NET Framework的编程语言。例如,使用C#可以编写动态Web页面、Windows Presentation Foundation应用程序、XML Web服务、分布式应用程序的组件、数据库访问组件、传统的Windows桌面应用程序,甚或可以联机/脱机运行的新型智能客户端应用程序。本书介绍.NET Framework 4.5.1。如果读者使用以前的版本编码,本书的一些章节就不适用。本书将标注出专用于.NET Framework 4.5和4.5.1的新增内容。

不要被这个架构名称中的.NET所迷惑,认为这是一个只关注Internet的架构。这个名称中的.NET仅强调Microsoft相信分布式应用程序是未来的趋势,即处理过程分布在客户端和服务器上。理解C#不仅仅是编写Internet或网络识别应用程序的一种语言也很重要。它还提供了一种编写Windows平台上几乎任何类型的软件或组件的方式。另外,C#和.NET都对开发人员编写程序的方式进行了革新,更易于实现在Windows上的编程。

那么,.NET和C#有什么优点?

.NET和C#的重要性

为了理解.NET的重要性,就一定要了解过去20年来出现的许多Windows技术的本质。尽管所有Windows操作系统在表面上看来完全不同,但从Windows 3.1(1993年引入)到Windows 8.1和Windows Server 2012 R2,在内核上都有相同的Windows API用于Windows桌面和服务器应用程序。在我们转而使用Windows的新版本时,虽然API中增加了非常多的新功能,但这是一个演化和扩展API的过程,并非替换它。

在Windows 8中,操作系统的主API被Windows运行库替代。但这个运行库仍部分基于Windows API。

开发Windows软件所使用的许多技术和架构也是这样。例如,组件对象模型(Component Object Model,COM)源自对象链接和嵌入(Object Linking and Embedding,OLE)。最初,因为它在很大程度上仅把不同类型的Office文档链接在一起,所以利用它,例如,可以把一个小型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的语言,它可以利用.NET Framework及其开发环境中的所有新增功能,以及在最近25年来出现的面向对象的编程方法。

在继续介绍前,必须先说明,后向兼容性并没有在这个演化进程中丧失。现有的程序仍可以使用,.NET也兼容现有的软件。现在,在Windows上软件组件之间的通信几乎都使用COM实现。因此,.NET能够提供现有COM组件的包装器(wrapper),以便.NET组件与之通信。

我们不需要学习了C#才能给.NET编写代码,因为Microsoft已经扩展了C++,还对Visual Basic进行了很多改进,把它转变成了功能更强大的语言,并允许把用这些语言编写的代码用于.NET环境。但其他这些语言都因有多年演化的遗留痕迹,并非一开始就用现在的技术来编写,导致它们不能用于.NET环境。

本书将介绍C#编程技术,同时提供.NET体系结构工作原理的必要背景知识。我们不仅会介绍C#语言的基础,还会给出使用各种相关技术的应用程序对应的示例,包括数据库访问、动态的Web页面、高级的图形和目录访问等。

Windows API自从1993年发布的Windows NT以来一直在演化和扩展,但自从2002年以来,.NET Framework对程序编写方式进行了重大的修改,2012年又进行了一次很大的改动。每10年就会发生这种改变吗?Windows 8现在提供了一种新的API:用于Windows Store应用程序的Windows运行库(WinRT)。这个运行库是一个本机API(类似于Windows API),它没有把.NET运行库作为其核心,但提供了基于.NET理念的非常好的新功能。Windows 8包含这个API的第一个版本,可用于现代模式的应用程序。尽管它不基于.NET,但仍可以将.NET的一个子集应用于Windows Store应用程序,用C#编写该应用程序。这个新的运行库正在演化,在Windows 8.1中包含它的版本2。本书也讨论了如何使用C#和WinRT编写Windows Store应用程序。

.NET的优点

前面阐述了.NET的优点,但并没有说它会使开发人员的工作更易完成。本节将简要讨论.NET的一些功能。

●  面向对象编程:.NET Framework和C#从一开始就完全基于面向对象的原则。

●  优秀的设计:一个基类库,它以一种非常直观的方式设计出来。

●  语言无关性:在.NET中,Visual Basic、C#和托管C++等语言都可以编译为通用的中间语言(Intermediate Language)。这说明,语言可以用以前没有的方式交互操作。

●  对动态Web页面的更好支持:虽然经典ASP具有很大的灵活性,但效率不是很高,这是因为它使用了解释性的脚本语言,且缺乏面向对象的设计,从而导致ASP代码比较混乱。.NET使用ASP.NET,为Web页面提供了一种集成支持。使用ASP.NET,可以编译页面中的代码,这些代码还可以使用.NET能识别的高级语言来编写,如C#或Visual Basic 2013。.NET现在还添加了对最新Web技术的重要支持,如Ajax和jQuery。

●  高效的数据访问:一组.NET组件,统称为ADO.NET,提供了对关系数据库和各种数据源的高效访问。这些组件也可用于访问文件系统和目录。尤其是,.NET内置了XML支持,可以处理从非Windows平台导入或导出的数据。

●  代码共享:.NET引入了程序集的概念,替代了传统的DLL,可以完美无瑕地改进代码在应用程序之间的共享方式。程序集是解决版本冲突的正式设备,程序集的不同版本可以并存。

●  增强的安全性:每个程序集还可以包含内置的安全信息,这些信息可以准确地指出哪种类型的用户或进程可以调用什么类的哪些方法。这样就可以非常准确地控制用户部署的程序集的使用方式。

●  对安装没有任何影响:有两种类型的程序集,分别是共享程序集和私有程序集。共享程序集是可用于所有软件的公共库,而私有程序集只用于特殊软件。由于私有程序集完全自包含,因此安装过程非常简单。没有注册表项,只需要把相应的文件放在文件系统的相应文件夹中即可。

●  Web服务的支持:.NET完全集成了对开发Web服务的支持,用户可以轻松地开发任何类型的应用程序。

●  Visual Studio 2013:.NET附带了一个Visual Studio 2013开发环境,它同样可以很好地利用C++、C#、Visual Basic 2013和ASP.NET或XML进行编码。Visual Studio 2013集成了这个IDE所有以前版本中的各种语言专用环境中的所有最佳功能。

●  C#:是使用.NET的一种面向对象的强大且流行的语言。

第1章将详细讨论.NET体系结构的优点。

.NET Framework 4.5和4.5.1中的新增特性

.NET Framework的第1版(1.0版)在2002年发布,赢得了许多人的喝彩。.NET Framework 2.0在2005年发布,是该架构的一个主要版本。2.0版本的主要新特性是C#和运行库中对泛型的支持(为泛型修改了IL代码)、新类和接口。.NET 3.0以2.0运行库为基础,引入了创建UI的新方式(WPF和XAML,基于矢量的图形替代了基于像素的图形)和一个新的通信技术(WCF)。.NET 3.5和C# 3.0引入了LINQ,这是可用于所有数据源的查询语法。.NET Framework 4是该产品的另一个重要的版本,也引入了运行库的一个新版本4.0和C#的新版本4.0,提供了动态语言集成和大量用于并行编程的新库。.NET Framework 4.5基于4.0运行库的更新版本,包含了许多重要的新功能。.NET Framework 4.5.1增加了一些新功能。但是,随着.NET Framework中越来越多的库发布为NuGet包,越来越多的功能超出了.NET Framework的界限。例如,Entity Framework、ASP.NET Web API和其他.NET库都获得了巨大的改进。

对于.NET Framework的每个版本,Microsoft总是试图确保对已开发出的代码进行尽可能少的不兼容的更改。到目前为止,Microsoft在这方面做得很成功。

下面将详细描述C# 5.0和.NET Framework 4.5.1中的一些新变化。

异步编程

阻塞UI对用户并不友好,如果UI不响应,用户就会不耐烦。也许读者在Visual Studio中也有这种经历。而Visual Studio在这方面好了许多,在许多情形下响应得更快。

.NET Framework总是提供方法的异步调用。但是,使用同步方法比调用其异步变体容易得多。这在C# 5.0版本中有了改变。异步编程与编写同步程序一样容易。新的C#关键字基于自从.NET 4.0以来就有的.NET并行库,现在该语言提供了高效功能。

Windows Store应用程序和Windows运行库

Windows Store应用程序可以使用C#、Windows运行库和.NET Framework的一个子集编写,Windows运行库是一个新的本机API,提供了类似于.NET的类、方法、属性和事件。使用语言投射功能,改善了.NET运行库。在.NET 4.5中,.NET 4.0运行库进行了就地更新。

数据访问的改善

ADO.NET Entity Framework提供了重要的新功能。其版本从.NET 4.0的4.0改为.NET 4.5的5.0,再改为.NET 4.5.1的6.0。.NET 4.0发布后,Entity Framework已经在4.1、4.2和4.3中接受了更新。现在新功能,例如Code First、空间类型、使用枚举、表值功能等,都可以使用了。

WPF的改善

WPF进行了改进,以编写Windows桌面应用程序。现在可以在非UI线程中填充集合,功能区控件现在是架构的一部分,通过事件的弱引用也更容易实现,数据验证可以用INotifyDataErrorInfo接口异步完成;实时绘图功能可以方便地动态排序、分组修改了的数据。

ASP.NET MVC

Visual Studio 2010包含ASP.NET MVC 2.0。Visual Studio 2013发布后,就可以使用ASP.NET MVC 5.0了。ASP.NET MVC提供了许多开发人员期待的、使用模型-视图-控制器来创建ASP.NET应用程序的方式。ASP.NET MVC在开发人员构建的应用程序中提供了可测试性、灵活性和可维护性。ASP.NET MVC不是ASP.NET Web窗体的替代品,而只是构建应用程序的另一种方式。

C#的优点

C#在某种程度上可以看作.NET面向Windows环境的一种编程语言。在过去的15年中,Microsoft给Windows和 Windows API添加了许多功能,Visual Basic 2013和C++也进行了许多扩展。虽然Visual Basic和C++最终已成为非常强大的语言,但这两种语言也存在问题,因为它们保留了原来的一些遗留内容。

对于Visual Basic 6及其早期版本,它的主要优点是很容易理解,许多编程工作都很容易完成,从很大程度上对开发人员隐藏了Windows API和COM组件结构的详细信息。其缺点是因为Visual Basic从来没有实现真正意义上的面向对象,所以大型应用程序很难分解和维护。另外,因为Visual Basic的语法继承自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 Basic演变为Visual Basic 2013,保留了一些基本的Visual Basic语法,但在设计上完全不同于原始Visual Basic,从实际应用的角度来看,Visual Basic 2013是一种新语言。

在这里,Microsoft决定给开发人员提供另一个选择—— 专门用于.NET、具有新起点的一种语言,即C#。Microsoft在正式场合将C#描述为一种简单、现代、面向对象、类型非常安全、派生自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 Basic的风格支持属性和事件。

●  改变编译器选项,可以把程序编译为可执行文件或.NET组件库,该组件库可以用与ActiveX控件(COM组件)相同的方式由其他代码调用。

●  C#可以用于编写ASP.NET动态Web页面和XML Web服务。

应该指出,对于上述大多数功能,Visual Basic 2013和Managed C++也具备。事实上,虽然C#从一开始就使用.NET,但对.NET功能的支持不仅更完整,而且在比其他语言更合适的语法环境中提供了这些功能。C#语言本身非常类似于Java,但其中有一些改进,尤其是,Java并不应用于.NET环境。

在结束这个主题前,还要指出C#的两个局限性。一方面是该语言不适用于编写时间急迫或性能非常高的代码,例如一个要占用1000或1050个机器周期的循环,并在不需要这些资源时,立即清理它们。在这方面,C++可能仍是所有低级语言中的佼佼者。另一方面是C#缺乏性能极高的应用程序所需要的关键功能,包括能够指定那些保证在代码的特定地方运行的内联函数和析构函数。但这类应用程序非常少。

编写和运行C#代码的环境

.NET Framework 4.5.1运行在Windows Vista/7/8/8.1和服务器操作系统Windows Server 2008、 2008 R2、2012和2012 R2上。要使用.NET编写代码,需要安装.NET 4.5.1 SDK。

此外,除非要使用文本编辑器或其他第三方开发环境来编写C#代码,否则用户几乎肯定也希望使用Visual Studio 2013。运行托管代码不需要安装完整的SDK,但需要.NET运行库。需要把.NET运行库和代码分布到还没有安装它的客户端上。

本书内容

本书首先在第1章介绍.NET的整体体系结构,给出编写托管代码所需要的背景知识,此后本书分几部分介绍C#语言及其在各个领域中的应用。

第Ⅰ部分—— C#语言

本部分给出C#语言的背景知识。尽管这一部分假定读者是有经验的编程人员,但它没有假设读者拥有任何特殊语言的知识。首先介绍 C#的基本语法和数据类型,再介绍C#的面向对象功能,之后是C#中的一些高级编程主题。

第Ⅱ部分—— Visual Studio 

本部分介绍全世界C#开发人员都使用的主要IDE:Visual Studio 2013。本部分的两章探讨使用工具构建基于.NET Framework 4.5.1的应用程序的最佳方式,另外,本部分还讨论项目的部署。

第Ⅲ部分—— 基础 

本部分介绍在.NET环境中编程的规则。特别是安全性、线程、本地化、事务、构建Windows服务的方式,以及将自己的库生成为程序集的方式等主题。其中一部分介绍如何使用平台调用和COM交互操作功能,与本地代码和程序集进行交互操作。本部分还讨论了Windows运行库与.NET的区别,以及如何编写Windows 8模式的程序。

第Ⅳ部分—— 数据

本部分介绍如何使用ADO.NET访问数据库,学习ADO.NET Entity Framework。我们可以使用核心ADO.NET获得最佳性能,而使用ADO.NET Entity Framework可以方便地把对象映射到关系上。还讨论了现在可以使用的Model First、Database First和Code First编程模型。我们还详细说明.NET对XML的支持,以及如何使用LINQ查询XML数据源。

第Ⅴ部分—— 显示

本部分首先阐述如何编写基于Windows Presentation Foundation的应用程序,介绍不同的控件类型、样式、资源和数据绑定,以及如何创建固定的和流畅的文档并打印出来。本部分还会介绍如何创建Windows Store应用程序,使用图片生成更漂亮的UI、网格,以及与其他应用程序交互操作的协定。最后讨论ASP.NET提供的许多新功能,用ASP.NET Web窗体创建Web站点、ASP.NET MVC和动态数据。

第Ⅵ部分——通信

这一部分介绍通信,主要论述独立于平台使用Windows Communication Foundation(WCF)和ASP.NET Web API进行通信的服务。通过消息队列,揭示了断开连接的异步通信。本部分还介绍如何利用Windows Workflow Foundation(WF)和对等网络。

如何下载本书的示例代码

在读者学习本书中的示例时,可以手工输入所有的代码,也可以使用本书附带的源代码文件。本书使用的所有源代码都可以从本书合作站点http://www.wrox.com/go/procsharp上下载。登录到站点http://www.wrox.com/上,使用Search工具或书名列表就可以找到本书。接着单击本书细目页面上的Download Code链接,就可以获得所有的源代码。

注释:

许多图书的书名都很相似,所以通过ISBN查找本书是最简单的,本书英文版的ISBN是978-1-118-83303-2。

在下载了代码后,只需用自己喜欢的解压缩软件对它进行解压缩即可。另外,也可以进入http://www.wrox.com/dynamic/books/download.aspx上的Wrox代码下载主页,查看本书和其他Wrox图书的所有代码。

勘误表

尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但错误总是难免的,如果你在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。

要在网站上找到本书的勘误表,可以登录http://www.wrox.com,通过Search工具或书名列表查找本书,然后在本书的细目页面上,单击Book Errata链接。在这个页面上可以查看Wrox编辑已提交和粘贴的所有勘误项。完整的图书列表还包括每本书的勘误表,网址是www.wrox.com/misc-pages/ booklist.shtml。

如果在Book Errata页面上没有看到你找出的错误,请进入www.worx.com/contact/ techsupport.shtml,填写表单,发电子邮件,我们就会检查你的信息,如果是正确的,就在本书的勘误表中粘贴一条消息,我们将在本书的后续版本中采用。

p2p.wrox.com

P2P邮件列表是为作者和读者之间的讨论而建立的。读者可以在p2p.wrox.com上加入P2P论坛。该论坛是一个基于Web的系统,用于传送与Wrox图书相关的信息和相关技术,与其他读者和技术用户交流。该论坛提供了订阅功能,当论坛上有新帖子时,会给你发送你选择的主题。Wrox作者、编辑和其他业界专家和读者都会在这个论坛上进行讨论。

在http://p2p.wrox.com上有许多不同的论坛,帮助读者阅读本书,在读者开发自己的应用程序时,也可以从这个论坛中获益。要加入这个论坛,必须执行下面的步骤:

(1) 进入p2p.wrox.com,单击Register链接。

(2) 阅读其内容,单击Agree按钮。

(3) 提供加入论坛所需的信息及愿意提供的可选信息,单击Submit按钮。

(4) 然后就可以收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程。

提示:

不加入P2P也可以阅读论坛上的信息,但只有加入论坛后,才能发送自己的信息。

加入论坛后,就可以发送新信息,回应其他用户的帖子。可以随时在Web上阅读信息。如果希望某个论坛给自己发送新信息,可以在论坛列表中单击该论坛对应的Subscribe to this Forum图标。

对于如何使用Wrox P2P的更多信息,可阅读P2P FAQ,了解论坛软件的工作原理,以及许多针对P2P和Wrox图书的常见问题解答。要阅读FAQ,可以单击任意P2P页面上的FAQ链接。