该书为C#经典名著!是Wrox红皮书中最畅销的品种之一。从第1版开始就名满天下;其第3版被评选为2005年最权威的十大IT图书之一;并荣获“2005年度引进版科技类优秀图书”奖。更可贺的是,其第4版又荣获“2006年最受读者喜爱的十大技术开发类图书”!第5版在详尽论述C# 2005的基础上,又增加了.NET 3.0 Framework的新特性,更加完善了C#的技术。是缺乏C#或.NET编程经验,但有其他语言编程经验的开发人员,以及了解
.NET 2.0,而且对.NET 3.0和Visual Studio 2005有兴趣的程序员全面掌握C#的首选教程。
上 卷
第Ⅰ部分 C# 语 言
第1章 .NET体系结构
1.1 C#与.NET的关系
1.2 公共语言运行库
1.3 中间语言
1.4 程序集
1.5 .NET Framework类
1.6 命名空间
1.7 用C#创建.NET应用程序
1.8 C#在.NET企业体系结构中的作用
1.9 小结
第2章 C#基础
2.1 引言
2.2 第一个C#程序
2.3 变量
2.4 预定义数据类型
2.5 流控制
2.6 枚举
2.7 数组
2.8 命名空间
2.9 Main()方法
2.10 有关编译C#文件的更多内容
2.11 控制台I/O
2.12 使用注释
2.13 C#预处理器指令
2.14 C#编程规则
2.15 小结
第3章 对象和类型
3.1 类和结构
3.2 类成员
3.3 结构
3.4 部分类
3.5 静态类
3.6 Object类
3.7 小结
第4章 继承
4.1 继承的类型
4.2 实现继承
4.3 修饰符
4.4 接口
4.5 小结
第5章 数组
5.1 简单数组
5.2 多维数组
5.3 锯齿数组
5.4 Array类
5.5 数组和集合接口
5.6 枚举
5.7 小结
第6章 运算符和类型强制转换
6.1 运算符
6.2 类型的安全性
6.3 对象的相等比较
6.4 运算符重载
6.5 用户定义的数据类型转换
6.6 小结
第7章 委托和事件
7.1 委托
7.2 委托推断
7.3 匿名方法
7.4 事件
7.5 小结
第8章 字符串和正则表达式
8.1 System.String类
8.2 正则表达式
8.3 小结
第9章 泛型
9.1 概述
9.2 创建泛型类
9.3 泛型类的特性
9.4 泛型接口
9.5 泛型方法
9.6 泛型委托
9.7 Framework的其他泛型类型
9.8 小结
第10章 集合
10.1 集合接口和类型
10.2 列表
10.3 队列
10.4 栈
10.5 链表
10.6 有序表
10.7 字典
10.8 带多个键的字典
10.9 位数组
10.10 性能
10.11 小结
第11章 内存管理和指针
11.1 后台内存管理
11.2 释放未托管的资源
11.3 不安全的代码
11.4 小结
第12章 反射
12.1 定制特性
12.2 反射
12.3 小结
第13章 错误和异常
13.1 错误和异常处理
13.2 小结
第Ⅱ部分 Visual Studio
第14章 Visual Studio 2
14.1 使用Visual Studio 2
项目
14.2 修订功能
14.3 Visual Studio 2005 for.NET Framework 3.
14.4 小结
第15章 部署
15.1 部署的设计
15.2 部署选项
15.3 部署的要求
15.4 部署.NET运行库
15.5 简单的部署
15.6 Installer项目
15.7 ClickOnce
15.8 小结
第Ⅲ部分 基 类 库
第16章 程序集
16.1 程序集的含义
16.2 程序集的结构
16.3 跨语言支持
16.4 全局程序集缓存
16.5 创建共享程序集
16.6 配置
16.7 小结
第17章 跟踪和事件
17.1 跟踪
17.2 事件日志
17.3 性能监控
17.4 小结
第18章 线程和同步
18.1 概述
18.2 异步委托
18.3 Thread类
18.4 线程池
18.5 线程问题
18.6 同步
18.7 COM单元
18.8 BackgroundWorker组件
18.9 小结
第19章 .NET的安全性
19.1 代码访问的安全性
19.2 对Framework中安全性的支持
19.3 安全策略的管理
19.4 基于角色的安全性
19.5 小结
第20章 本地化
20.1 System.Globalization命名空间
20.2 资源
20.3 使用Visual Studio的本地化示例
20.4 用ASP.NET本地化
20.5 定制的资源读取器
20.6 创建定制文化
20.7 小结
第21章 事务处理
21.1 概述
21.2 数据库和类
21.3 传统的事务处理
21.4 System.Transactions
21.5 隔离级别
21.6 定制资源管理器
21.7 Windows Vista的事务处理
21.8 小结
第22章 Windows服务
22.1 Windows服务
22.2 Windows服务的体系结构
22.3 System.ServiceProcess命名空间
22.4 创建Windows服务
22.5 服务的监视和控制
22.6 故障排除
22.7 电源事件
22.8 小结
第23章 COM的互操作性
23.1 .NET和COM
23.2 编组
23.3 在.NET客户程序中使用COM组件
23.4 在COM客户程序中使用.NET组件
23.5 平台调用
23.6 小结
第Ⅳ部分 数 据
第24章 文件和注册表操作
24.1 管理文件系统
24.2 移动、复制和删除文件
24.3 读写文件
24.4 读取驱动器信息
24.5 文件的安全性
24.6 读写注册表
24.7 读写独立存储器
24.8 小结
第25章 .NET数据访问
25.1 ADO.NET概述
25.2 使用数据库连接
25.3 命令
25.4 快速数据访问:数据读取器
25.5 管理数据和关系:DataSet类
25.6 XML模式
25.7 填充数据集
25.8 保存对数据集的修改
25.9 使用ADO.NET
25.10 小结
第26章 处理XML
26.1 .NET支持的XML标准
26.2 System.Xml命名空间
26.3 在.NET中使用MSXML
26.4 使用System.Xml类
26.5 读写流格式的XML
26.6 在.NET中使用DOM
26.7 使用XPathNavigator
26.8 XML和ADO.NET
26.9 在XML中串行化对象
26.10 小结
第27章 .NET编程和SQL
Server 2
27.1 .NET运行库的主机
27.2 Microsoft.SqlServer.Server
27.3 用户定义的类型
27.4 用户定义的合计函数
27.5 存储过程
27.6 用户定义的函数
27.7 触发器
27.8 XML数据类型
27.9 小结
下 卷
第Ⅴ部分 显 示
第28章 Windows窗体
28.1 创建Windows窗体应用程序
28.2 Control类
28.3 标准控件和组件
28.4 窗体
28.5 小结
第29章 查看.NET数据
29.1 DataGridView控件
29.2 DataGridView类的29.3 数据绑定
29.4 Visual Studio .NET 和数据访问
29.5 小结
第30章 使用GDI+绘图
30.1 理解绘图规则
30.2 测量坐标和区域
30.3 调试须知
30.4 绘制可滚动的窗口
30.5 世界、页面和设备坐标
30.6 颜色
30.7 画笔和钢笔
30.8 绘制图形和线条
30.9 显示图像
30.10 处理图像时所涉及到的问题
30.11 绘制文本
30.12 简单的文本示例
30.13 字体和字体系列
30.14 示例:枚举字体系列
30.15 编辑文本文档:CapsEditor示例
30.16 打印
30.17 小结
第31章 Windows Presentation-Foundation
31.1 概述
31.2 形状
31.3 控件
31.4 布局
31.5 事件处理
31.6 命令
31.7 样式、模板和资源
31.8 动画
31.9 数据绑定
31.10 Windows窗体集成
31.11 小结
第32章 ASP.NET页面
32.1 ASP.NET概述
32.2 ASP.NET Web窗体
32.3 ADO.NET和数据绑定
32.4 应用程序配置
32.5 小结
第33章 ASP.NET开发
33.1 定制控件
33.2 Master页面
33.3 站点导航
33.4 安全性
33.5 主题
33.6 Web Parts
33.7 小结
第34章 ASP.NET AJAX
34.1 Ajax的概念
34.2 ASP.NET AJAX
Futures CTP
34.3 支持ASP.NET AJAX的网站
34.4 小结
第Ⅵ部分 通 信
第35章 访问Internet
35.1 WebClient类
35.2 WebRequest类和WebResponse类
35.3 把输出结果显示为HTML页面
35.4 实用工具类
35.5 较低层的协议
35.6 小结
第36章 Web服务和ASP.NET
36.1 SOAP
36.2 WSDL
36.3 Web服务
36.4 扩充会议登记示例
36.5 使用SOAP标题交换数据
36.6 小结
第37章 .NET Remoting
37.1 .NET Remoting的含义
CLR Object Remoting
37.2 .NET Remoting概述
37.3 环境
37.4 远程对象、客户机和服务器
37.5 .NET Remoting体系结构
37.6 .NET Remoting的其他特性
37.7 小结
第38章 Enterprise Services
38.1 概述
38.2 创建简单的COM+应用程序
38.3 部署
38.4 Component Services浏览器
38.5 客户应用程序
38.6 事务处理
38.7 示例应用程序
38.8 集成WCF和Enterprise
Services
38.9 小结
第39章 消息队列
39.1 概述
39.2 Message Queuing产品
39.3 Message Queuing结构
39.4 Message Queuing管理工具
39.5 Message Queuing的编程实现
39.6 课程订单应用程序
39.7 接收结果
39.8 事务队列
39.9 消息队列的安装
39.10 小结
第40章 Windows Communication Foundation
40.1 概述
40.2 简单的服务和客户
40.3 合同
40.4 服务的实现
40.5 绑定
40.6 主机
40.7 客户程序
40.8 双向通信
40.9 小结
第41章 Windows Workflow
Foundation
41.1 Hello World示例
41.2 活动
41.3 定制的活动
41.4 工作流
41.5 工作流运行库
41.6 工作流服务
41.7 保存工作流
41.8 工作流设计器
41.9 小结
41.10 下载信息
第42章 目录服务
42.1 Active Directory的体系结构
42.2 Active Directory的管理工具
and Computers工具
42.3 Active Directory编程
42.4 搜索用户对象
42.5 DSML
42.6 小结
第Ⅶ部分 其 他 信 息
第43章 C#、Visual Basic和C++/CLI
43.1 命名空间
43.2 定义类型
43.3 方法
43.4 静态成员
43.5 数组
43.6 控制语句
43.7 循环
43.8 异常处理
43.9 继承
43.10 资源管理
43.11 委托
43.12 事件
43.13 泛型
43.14 C++/CLI混合内置代码和托管代码
43.15 小结
第44章 Windows Vista
44.1 Vista Bridge
44.2 用户账户控制
44.3 目录结构
44.4 新控件和对话框
44.5 搜索
44.6 小结
第45章 Language Integrated
Query
45.1 传统的查询
45.2 LINQ查询
45.3 查询表达式
45.4 扩展方法
45.5 标准的查询操作符
45.6 λ表达式
45.7 推迟查询的执行
45.8 表达式树
45.9 类型推断
45.10 对象和集合初始化器
45.11 匿名类型
45.12 小结
对于开发人员来说,把C#语言及其相关环境.NET Framework描述为多年来最重要的新技术一点都不夸张。.NET提供了一种新环境。在这个环境中,可以开发出运行在Windows上的几乎所有应用程序,而C#是专门用于.NET的新编程语言。例如,使用C#可以编写出动态Web页面、XML Web服务、分布式应用程序的组件、数据库访问组件、传统的Windows桌面应用程序,甚或可以联机/脱机运行的新型智能客户应用程序。本书介绍.NET Framework 2.0和新发布的.NET Framework 3.0版。如果读者使用1.0、1.1或2.0版本编码,本书的一些章节就不适用。本书将标注出只适用于.NET Framework 3.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的整数值是4294967296而2^64的整数值是18446744073709551616。应用程序将更便于计算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位计算机。
泛型
为了使集合的功能更强大,也为了提高它们的效率和可用性,.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类实例中,就好像它们从一开始就放在一起一样。
.NET Framework 3.0简介
.NET Framework的最新版本是3.0,这个版本引入了一些全新的功能。在这个版本中,可以用Windows Presentation Foundation(WPF)建立新的应用程序类型,基于Windows Communication Foundation(WCF)、Windows Workflow Foundation(WF)和Windows CardSpace的应用程序和库。
这些新增的功能是.NET Framework 3.0的组成部分,因为这个Framework版本是在以前.NET Framework 2.0的基础上安装和运行。本书将在许多章节中介绍.NET Framework 3.0引入的新技术。
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 2.0运行在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在这个服务器上并不是默认安装选项。
.NET Framework 3.0需要Windows XP SP2、Windows Server 2003 SP1或Windows Vista才能运行。介绍.NET Framework 3.0的章节中的示例都需要在这些操作系统上运行。
除非要使用文本编辑器或其他第三方开发环境来编写C#代码,否则一般使用Visual Studio 2005。运行托管代码不需要安装完整的SDK,但需要.NET运行库。需要把.NET运行库分布到还没有安装它的客户机上。
本书内容
在本书中,首先在第1章介绍.NET的整体体系结构,给出编写托管代码所需要的背景知识,此后本书分几部分介绍C#语言及其在各个领域中的应用。
第Ⅰ部分—— C#语言
本部分给出C#语言的背景知识。这一部分没有指定任何语言,但假定读者是有经验的编程人员。首先介绍 C#的基本语法和数据类型,再介绍C#的面向对象特性,之后是C#中的一些高级论题。
第Ⅱ部分—— Visual Studio
本部分介绍全世界C#开发人员都使用的主要IDE:Visual Studio 2005。本部分的两章探讨使用工具建立基于.NET Framework 2.0或3.0的应用程序的最佳方式,另外,还讨论项目的部署。
第Ⅲ部分—— 基类库
本部分介绍在.NET环境中编程的规则。特别是安全性、线程本地化、事务处理、建立Windows服务的方式,以及将自己的库生成为程序集的方式。
第Ⅳ部分—— 数据
本部分介绍如何使用ADO.NET访问数据库,以及与目录和文件的交互。我们还详细说明.NET对XML的支持、对Windows操作系统的支持,以及SQL Server 2005的.NET特性。
第Ⅴ部分—— 显示
本部分讨论传统Windows应用程序的创建,在.NET中这种应用程序称为Windows窗体。Windows窗体是应用程序的胖客户版本,使用.NET创建这些类型的应用程序是实现该任务的一种快捷、简单的方式。除了介绍Windows窗体之外,我们还将论述GDI+,这种技术可用于创建包含高级图形的应用程序。本部分还阐述如何编写在网站上运行的组件,如何编写网页。其中包括ASP.NET 2.0提供的许多新特性。最后,我们还将陈述如何建立基于WPF的应用程序。
第Ⅵ部分——通信
这一部分介绍通信,主要论述独立于平台进行通信的Web服务、在.NET客户机和服务器之间通信的.NET Remoting技术、在后台上运行的Enterprise Services和DCOM通信。有了消息异步排队技术,可以进行断开连接的通信。本部分还介绍如何利用新的WCF和WF。
第Ⅶ部分—— 其他信息
这一部分介绍如何建立应用程序,来利用Windows Vista中的新功能,并探讨未来的LINQ技术,以及如何在C#应用程序中使用它。
如何下载本书的示例代码
在读者学习本书中的示例时,可以手工输入所有的代码,也可以使用本书附带的源代码文件。本书使用的所有源代码都可以从本书合作站点http://www.wrox.com/上下载。登录到站点http://www.wrox.com/上,使用Search工具或书名列表就可以找到本书。接着单击本书细目页面上的Download Code链接,就可以获得所有的源代码。
注释:
许多图书的书名都很相似,所以通过ISBN查找本书是最简单的,本书的ISBN是978-0-470-12472-7。
在下载了代码后,只需用自己喜欢的解压缩软件对它进行解压缩即可。另外,也可以进入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。请给wkservice@tup.tsinghua.edu.cn发电子邮件,我们就会检查您的信息,如果是正确的,我们将在本书的后续版本中采用。
p2p.wrox.com
P2P邮件列表是为作者和读者之间的讨论而建立的。读者可以在p2p.wrox.com上加入P2P论坛。该论坛是一个基于Web的系统,用于传送与Wrox图书相关的信息和相关技术,与其他读者和技术用户交流。该论坛提供了订阅功能,当论坛上有新贴子时,会给您发送您选择的主题。Wrox作者、编辑和其他业界专家和读者都会在这个论坛上进行讨论。
在http://p2p.wrox.com上有许多不同的论坛,帮助读者阅读本书,在读者开发自己的应用程序时,也可以从这个论坛中获益。要加入这个论坛,需执行下面的步骤:
(1) 进入p2p.wrox.com,单击Register链接。
(2) 阅读其内容,单击Agree按钮。
(3) 提供加入论坛所需的信息及愿意提供的可选信息,单击Submit按钮。
然后就可以收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程。
提示:
不加入P2P也可以阅读论坛上的信息,但只有加入论坛后,才能发送自己的信息。
加入论坛后,就可以发送新信息,回应其他用户的贴子。可以随时在Web上阅读信息。如果希望某个论坛给自己发送新信息,可以在论坛列表中单击该论坛对应的Subscribe to this Forum图标。
对于如何使用Wrox P2P的更多信息,可阅读P2P FAQ,了解论坛软件的工作原理,以及许多针对P2P和Wrox图书的常见问题解答。要阅读FAQ,可以单击任意P2P页面上的FAQ链接。
无封面