C#与.NET为在Windows平台上编程提供了一个全新的开发环境,在此环境中几乎可以开发出所有基于Windows和Web的应用程序。本书全面介绍了C#的编程知识,同时提供了理解.NET体系结构工作原理所必需的背景知识,相对前两个版本新增了应用程序的部署和本地化等内容。
本书是开发人员必备的C#参考资料,是C#和.NET用户的良师益友。通过对本书的学习,您将对C#语言的各个方面有深入细致的理解,能够在.NET环境中应用C#,构建Windows窗体,用ADO.NET访问数据库,用ASP.NET编写组件,利用.NET为COM和COM+提供支持等。
该书的第1版、第2版分别印刷7350册和8925册,。第3版的内容比前两版更加完善实用,而且翻译质量有了进一步的提高。
与该书对应的基础书《C#入门经典》目前已经销量近12000册。
第1章 .NET体系结构 1
1.1 C#与.NET的关系 1
1.2 公共语言运行库 1
1.3 中间语言 4
1.3.1 面向对象和接口的支持 5
1.3.2 值类型和引用类型 6
1.3.3 强数据类型 6
1.3.4 通过异常处理错误 12
1.3.5 特性的使用 12
1.4 程序集 12
1.4.1 私有程序集 13
1.4.2 共享程序集 14
1.4.3 反射 14
1.5 .NET Framework类 14
1.6 用C#创建.NET应用程序 16
1.6.1 创建ASP.NET应用程序 16
1.6.2 创建Windows窗体 18
1.6.3 Windows服务 18
1.7 C#在.NET企业体系结构中的作用 18
1.8 小结 20
第2章 C#基础 21
2.1 引言 21
2.2 第一个C#程序 22
2.2.1 代码 22
2.2.2 编译并运行程序 22
2.2.3 详细介绍 23
2.3 变量 25
2.3.1 变量的初始化 26
2.3.2 变量的作用域 26
2.3.3 常量 29
2.4 预定义数据类型 30
2.4.1 值类型和引用类型 30
2.4.2 CTS类型 31
2.4.3 预定义的值类型 32
2.4.4 预定义的引用类型 35
2.5 流控制 37
2.5.1 条件语句 37
2.5.2 循环 41
2.5.3 跳转语句 44
2.6 枚举 45
2.7 数组 47
2.8 命名空间 48
2.8.1 using语句 49
2.8.2 命名空间的别名 50
2.9 Main()方法 51
2.9.1 多个Main()方法 51
2.9.2 给Main()方法传送参数 52
2.10 有关编译C#文件的更多内容 53
2.11 控制台I/O 55
2.12 使用注释 57
2.12.1 源文件中的内部注释 57
2.12.2 XML文档说明 57
2.13 C#预处理器指令 59
2.13.1 #define和 #undef 60
2.13.2 #if, #elif, #else和 #endif 60
2.13.3 #warning和 # error 61
2.13.4 #region和#endregion 62
2.13.5 #line 62
2.14 C#编程规则 62
2.14.1 用于标识符的规则 63
2.14.2 用法约定 64
2.15 小结 69
第3章 对象和类型 70
3.1 类和结构 70
3.2 类成员 71
3.2.1 数据成员 71
3.2.2 函数成员 72
3.2.3 只读字段 86
3.3 结构 87
3.3.1 结构是值类型 88
3.3.2 结构和继承 89
3.3.3 结构的构造函数 89
3.4 Object类 90
3.4.1 System.Object方法 90
3.4.2 ToString()方法 91
3.5 小结 93
第4章 继承 94
4.1 继承的类型 94
4.1.1 实现继承和接口继承 94
4.1.2 多重继承 95
4.1.3 结构和类 95
4.2 实现的继承 95
4.2.1 虚方法 96
4.2.2 隐藏方法 97
4.2.3 调用函数的基础版本 98
4.2.4 抽象类和抽象函数 99
4.2.5 密封类和密封方法 100
4.2.6 派生类的构造函数 101
4.3 修饰符 105
4.3.1 可见性修饰符 105
4.3.2 其他修饰符 106
4.4 接口 107
4.4.1 定义和实现接口 108
4.4.2 派生的接口 112
4.5 小结 114
第5章 运算符和类型强制转换 115
5.1 运算符 115
5.1.1 运算符的简化操作 116
5.1.2 三元运算符 117
5.1.3 checked和 unchecked运算符 118
5.1.4 is运算符 119
5.1.5 as运算符 119
5.1.6 sizeof运算符 119
5.1.7 typeof运算符 119
5.1.8 运算符的优先级 120
5.2 类型的安全性 120
5.2.1 类型转换 121
5.2.2 装箱和取消装箱 124
5.3 对象的相等比较 125
5.3.1 引用类型的相等比较 125
5.3.2 ReferenceEquals()方法 125
5.3.3 虚拟的Equals()方法 125
5.3.4 静态的Equals()方法 125
5.3.5 比较运算符== 126
5.3.6 值类型的相等比较 126
5.4 运算符重载 126
5.4.1 运算符的工作方式 127
5.4.2 运算符重载的示例:Vector结构 128
5.5 用户定义的数据类型转换 135
5.5.1 执行用户定义的类型转换 137
5.5.2 多重数据类型转换 143
5.6 小结 147
第6章 委托和事件 148
6.1 委托 148
6.1.1 在C#中使用委托 149
6.1.2 简单的委托示例 153
6.1.3 BubbleSorter示例 154
6.1.4 多播委托 157
6.2 事件 160
6.2.1 从客户的角度讨论事件 160
6.2.2 生成事件 162
6.3 小结 166
第7章 内存管理和指针 167
7.1 后台内存管理 167
7.1.1 值数据类型 167
7.1.2 引用数据类型 169
7.1.3 垃圾收集 171
7.2 释放未托管的资源 172
7.2.1 析构函数 172
7.2.2 IDisposable接口 173
7.2.3 实现IDisposable接口和析构函数 175
7.3 不安全的代码 176
7.3.1 指针 176
7.3.2 使用指针优化性能 191
7.4 小结 194
第8章 字符串和正则表达式 195
8.1 System.String类 195
8.1.1 创建字符串 196
8.1.2 格式化字符串 200
8.2 正则表达式 206
8.2.1 正则表达式概述 206
8.2.2 RegularExpressionsPlayaround示例 207
8.2.3 显示结果 209
8.2.4 匹配、组合和捕获 211
8.3 小结 212
第9章 集合 213
9.1 对象组 213
9.1.1 数组列表 213
9.1.2 集合 215
9.1.3 字典 219
9.2 小结 228
第10章 反射 229
10.1 定制特性 229
10.1.1 编写定制特性 230
10.1.2 定制特性示例WhatsNewAttributes 233
10.2 反射 237
10.2.1 System.Type类 237
10.2.2 TypeView示例 239
10.2.3 Assembly类 241
10.2.4 完成WhatsNewAttributes示例 243
10.3 小结 247
第11章 错误和异常 248
11.1 错误和异常处理 248
11.1.1 异常类 248
11.1.2 捕获异常 250
11.1.3 用户定义的异常类 259
11.2 小结 267
第12章 Visual Studio .NET 268
12.1 使用Visual Studio .NET 2003 268
12.1.1 创建项目 271
12.1.2 解决方案和项目 276
12.1.3 Windows应用程序代码 279
12.1.4 读取Visual Studio 6项目 279
12.1.5 项目的浏览和编码 280
12.1.6 生成项目 289
12.1.7 调试 293
12.2 其他.NET工具 295
12.2.1 ASP.NET Web Matrix Project 295
12.2.2 WinCV 296
12.3 小结 297
第13章 程序集 298
13.1 程序集的含义 298
13.1.1 DLL-Hell的解决方案 299
13.1.2 程序集的特性 299
13.1.3 应用程序域和程序集 300
13.2 程序集的结构 303
13.2.1 程序集的清单 303
13.2.2 命名空间、程序集和组件 304
13.2.3 私有程序集和共享程序集 304
13.2.4 查看程序集 304
13.2.5 构建程序集 305
13.3 跨语言支持 309
13.3.1 CTS和CLS 310
13.3.2 语言无关性 311
13.3.3 CLS要求 320
13.4 全局程序集缓存 321
13.4.1 本机图像生成器 322
13.4.2 全局程序集缓存查看器 322
13.4.3 全局程序集缓存工具(gacutil.exe) 324
13.5 创建共享程序集 324
13.5.1 共享程序集名 324
13.5.2 创建共享程序集 326
13.6 配置 331
13.6.1 配置类别 331
13.6.2 版本问题 332
13.6.3 配置目录 341
13.7 小结 343
第14章 .NET的安全性 344
14.1 代码访问的安全性 344
14.1.1 代码组 345
14.1.2 代码访问权限和权限集 351
14.1.3 策略的级别:Machine、User和Enterprise 355
14.2 对Framework中安全性的支持 357
14.2.1 要求权限 358
14.2.2 请求权限 359
14.2.3 隐式的权限 361
14.2.4 拒绝权限 362
14.2.5 断言权限 363
14.2.6 创建代码访问权限 365
14.2.7 声明的安全性 365
14.3 基于角色的安全性 366
14.3.1 Principal 366
14.3.2 Windows Principal 367
14.3.3 角色 368
14.3.4 声明基于角色的安全性 369
14.4 安全策略的管理 370
14.4.1 安全配置文件 370
14.4.2 代码组和权限的管理 373
14.4.3 安全性的启用和禁用 374
14.4.4 重置安全策略 374
14.4.5 代码组的创建 374
14.4.6 代码组的删除 375
14.4.7 代码组权限的更改 375
14.4.8 权限集的创建和应用 376
14.4.9 使用强名称发布代码 378
14.4.10 使用证书发布代码 381
14.4.11 区域的管理 386
14.5 小结 387
第15章 线程 389
15.1 线程 389
15.2 多线程应用程序 390
15.3 线程的处理 391
15.4 ThreadPlayaround示例 393
15.5 线程的优先级 397
15.6 同步 398
15.6.1 同步的含义 398
15.6.2 同步问题 399
15.7 小结 402
第16章 使用.NET Remoting的分布式应用程序 403
16.1 .NET Remoting的含义 404
16.1.1 应用程序类型和协议 404
16.1.2 CLR Object Remoting 405
16.2 .NET Remoting概述 405
16.3 环境 407
16.3.1 激活 408
16.3.2 特性和属性 408
16.3.3 环境之间的通信 409
16.4 远程对象、客户机和服务器 409
16.4.1 远程对象 409
16.4.2 简单的服务器 410
16.4.3 简单的客户机 411
16.5 .NET Remoting体系结构 413
16.5.1 信道 413
16.5.2 格式标识符 416
16.5.3 ChannelServices和RemotingConfiguration 417
16.5.4 对象的激活 418
16.5.5 消息接收器 422
16.5.6 在远程方法中传递对象 423
16.5.7 生存期管理 427
16.6 .NET Remoting的其他特性 430
16.6.1 配置文件 430
16.6.2 驻留应用程序 440
16.6.3 类、接口和Soapsuds 441
16.6.4 异步远程调用 443
16.6.5 远程调用和事件 445
16.6.6 调用环境 451
16.7 小结 453
第17章 本地化 454
17.1 System.Globalization命名空间 454
17.1.1 Unicode问题 454
17.1.2 文化和区域 455
17.1.3 使用文化 459
17.1.4 排序 464
17.2 资源 465
17.2.1 创建资源文件 466
17.2.2 ResGen 466
17.2.3 ResourceWriter 466
17.2.4 使用资源文件 467
17.2.5 System.Resources命名空间 470
17.3 使用Visual Studio .NET的本地化示例 470
17.3.1 外包翻译 476
17.3.2 编程修改文化 476
17.3.3 使用二进制资源文件 478
17.3.4 使用XML资源文件 479
17.3.5 资源的自动回退 480
17.4 ASP.NET应用程序的国际化和本地化 481
17.5 定制的资源读取器 482
17.5.1 创建DatabaseResourceReader类 483
17.5.2 创建DatabaseResourceSet类 484
17.5.3 创建DatabaseResourceManager类 485
17.5.4 DatabaseResourceReader的客户应用程序 486
17.6 小结 486
第18章 部署 487
18.1 部署的设计 487
18.2 部署选项 487
18.2.1 xcopy实用工具 487
18.2.2 复制项目 488
18.2.3 部署项目 488
18.3 部署的要求 488
18.4 简单的部署 489
18.4.1 xcopy部署 489
18.4.2 xcopy部置和Web应用程序 490
18.4.3 复制项目 491
18.5 Installer项目 492
18.5.1 Windows Installer 493
18.5.2 创建安装程序 493
18.5.3 高级选项 502
18.6 小结 508
第19章 Windows窗体 509
19.1 创建Windows窗体应用程序 509
19.2 Control类 515
19.2.1 大小和位置 516
19.2.2 外观 516
19.2.3 用户交互操作 516
19.2.4 Windows功能 517
19.2.5 杂项功能 518
19.2.6 类层次结构 518
19.3 标准控件和组件 519
19.3.1 Button控件 520
19.3.2 CheckBox控件 521
19.3.3 ComboBox控件与ListBox控件 521
19.3.4 DateTimePicker控件 522
19.3.5 ErrorProvider组件 522
19.3.6 HelpProvider组件 524
19.3.7 ImageList组件 524
19.3.8 Label控件 524
19.3.9 ListView控件 525
19.3.10 Panel控件 527
19.3.11 PictureBox控件 527
19.3.12 ProgressBar控件 527
19.3.13 RadioButton控件 528
19.3.14 TextBox控件与RichTextBox控件 528
19.3.15 Splitter控件 529
19.3.16 StatusBar控件 529
19.3.17 TabControl控件和TabPages控件 530
19.3.18 Menu控件 530
19.3.19 ToolBar控件 532
19.4 窗体 534
19.4.1 Form类 534
19.4.2 多文档界面 542
19.4.3 定制控件 545
19.5 小结 557
第20章 使用GDI+绘图 558
20.1 理解绘图规则 558
20.1.1 GDI和GDI+ 558
20.1.2 绘制图形 560
20.1.3 使用OnPaint()绘制图形 563
20.1.4 使用剪切区域 564
20.2 测量坐标和区域 565
20.2.1 Point和PointF结构 566
20.2.2 Size和SizeF结构 567
20.2.3 Rectangle和RectangleF结构 568
20.2.4 Region 569
20.3 调试须知 570
20.4 绘制可滚动的窗口 571
20.5 颜色 577
20.5.1 红绿蓝(RGB)值 577
20.5.2 命名的颜色 578
20.5.3 图形显示模式和安全的调色板 578
20.5.4 安全调色板 579
20.6 画笔和钢笔 579
20.6.1 画笔 580
20.6.2 钢笔 580
20.7 绘制图形和线条 581
20.8 显示图像 583
20.9 绘制文本 586
20.10 字体和字体系列 588
20.11 示例:枚举字体系列 590
20.12 编辑文本文档:CapsEditor示例 592
20.12.1 Invalidate()方法 596
20.12.2 计算项和文档的大小 597
20.12.3 OnPaint() 599
20.12.4 坐标转换 600
20.12.5 响应用户的输入 602
20.13 打印 605
20.14 小结 610
第21章 .NET数据访问 612
21.1 ADO.NET概述 612
21.1.1 命名空间 613
21.1.2 共享类 613
21.1.3 数据库特定的类 613
21.2 使用数据库连接 614
21.2.1 高效地使用连接 615
21.2.2 事务处理 618
21.3 命令 619
21.3.1 执行命令 620
21.3.2 调用存储过程 624
21.4 快速数据访问:数据读取器 627
21.5 管理数据和关系:DataSet类 630
21.5.1 数据表 630
21.5.2 数据列 631
21.5.3 数据关系 636
21.5.4 数据约束 638
21.6 XML模式 640
21.7 填充数据集 647
21.7.1 用数据适配器来填充 DataSet 647
21.7.2 从XML中给数据集填充数据 649
21.8 保存对数据集的修改 649
21.8.1 通过数据适配器进行更新 649
21.8.2 写入XML输出结果 652
21.9 使用ADO.NET 654
21.9.1 分层开发 654
21.9.2 SQL Server的键生成 655
21.9.3 命名约定 657
21.10 小结 658
第22章 查看.NET数据 660
22.1 DataGrid控件 660
22.1.1 显示列表数据 660
22.1.2 数据源 662
22.1.3 DataGrid类的层次结构 669
22.2 数据绑定 673
22.2.1 简单的绑定 673
22.2.2 数据绑定对象 674
22.3 Visual Studio .NET和数据访问 679
22.3.1 创建一个连接 679
22.3.2 选择数据 681
22.3.3 生成DataSet 683
22.3.4 更新数据源 684
22.3.5 构建模式 686
22.3.6 其他常见的要求 691
22.4 小结 700
第23章 处理XML 701
23.1 .NET支持的XML标准 701
23.2 System.Xml命名空间 702
23.3 在.NET中使用MSXML 703
23.4 使用System.Xml类 705
23.5 读写流格式的XML 706
23.5.1 使用 XmlTextReader类 706
23.5.2 使用XmlValidatingReader类 710
23.5.3 使用XmlTextWriter类 713
23.6 在.NET中使用DOM 714
23.7 在NET中使用XPath和XSLT 721
23.7.1 System.Xml.XPath命名空间 721
23.7.2 System.Xml.Xsl命名空间 725
23.8 XML和ADO.NET 730
23.8.1 将ADO.NET数据转换为XML文档 730
23.8.2 把XML文档转换为 ADO.NET数据 739
23.8.3 读写DiffGram 741
23.9 在XML中串行化对象 744
23.10 小结 756
第24章 使用Active Directory 757
24.1 Active Directory的体系结构 757
24.1.1 特性 758
24.1.2 Active Directory的概念 758
24.1.3 Active Directory数据的特性 762
24.1.4 模式 762
24.2 Active Directory的管理工具 763
24.2.1 Active Directory Users and Computers工具 764
24.2.2 ADSI Edit工具 765
24.3 Active Directory Service Interfaces 766
24.4 Active Directory编程 766
24.4.1 System.DirectoryServices命名空间中的类 767
24.4.2 绑定 767
24.4.3 获取目录项 771
24.4.4 对象集合 773
24.4.5 缓存 774
24.4.6 创建新对象 774
24.4.7 更新目录项 775
24.4.8 访问内部的ADSI对象 776
24.4.9 在Active Directory中搜索 777
24.5 搜索用户对象 781
24.5.1 用户界面 781
24.5.2 获取模式命名环境 782
24.5.3 获取User类的属性名 783
24.5.4 搜索用户对象 784
24.6 小结 786
第25章 ASP.NET页面 787
25.1 ASP.NET概述 787
25.2 ASP.NET Web窗体 788
25.3 ADO.NET和数据绑定 805
25.3.1 更新会议登记应用程序 805
25.3.2 数据绑定的更多内容 813
25.4 应用程序配置 819
25.5 小结 820
第26章 Web服务 821
26.1 SOAP 821
26.2 WSDL 823
26.3 Web服务 824
26.3.1 创建Web服务 824
26.3.2 使用Web服务 828
26.4 扩充会议登记示例 830
26.4.1 会议登记 Web服务 830
26.4.2 会议登记客户程序 834
26.5 使用SOAP标题交换数据 836
26.6 小结 841
第27章 用户控件和定制控件 842
27.1 用户控件 842
27.2 定制控件 849
27.2.1 定制控件的项目配置 850
27.2.2 基本的定制控件 853
27.2.3 创建合成的定制控件 858
27.3 测验民意的投票控件 860
27.3.1 Candidate 控件 862
27.3.2 StrawPoll控件构建器 864
27.3.3 测试民意的投票类型 865
27.3.4 测试民意的投票控件 865
27.4 小结 872
第28章 COM的互操作性 873
28.1 .NET和COM 873
28.1.1 元数据 874
28.1.2 释放内存 874
28.1.3 接口 874
28.1.4 方法绑定 876
28.1.5 数据类型 876
28.1.6 注册 876
28.1.7 线程 876
28.1.8 错误处理 878
28.1.9 事件处理 878
28.2 编组 879
28.3 在.NET客户程序中使用COM组件 879
28.3.1 创建COM组件 880
28.3.2 创建Runtime Callable Wrapper 884
28.3.3 线程问题 886
28.3.4 添加连接点 886
28.3.5 在Windows窗体中使用ActiveX控件 888
28.3.6 在ASP.NET中使用COM对象 891
28.4 在COM客户程序中使用.NET组件 892
28.4.1 COM Callable Wrapper 892
28.4.2 创建.NET组件 892
28.4.3 创建类型库 893
28.4.4 COM互操作特性 896
28.4.5 COM注册 899
28.4.6 创建COM客户程序 900
28.4.7 添加连接点 901
28.4.8 用sink对象创建客户 902
28.4.9 在Internet Explorer中运行Windows窗体控件 903
28.5 小结 904
第29章 Enterprise Services 905
29.1 概述 905
29.1.1 Enterprise Services简史 905
29.1.2 使用Enterprise Services的场合 905
29.1.3 环境 906
29.1.4 自动的事务处理 906
29.1.5 分布式事务处理 907
29.1.6 对象池 907
29.1.7 基于角色的安全性 907
29.1.8 排队的组件 907
29.1.9 松散藕合的事件 907
29.2 创建简单的COM+应用程序 908
29.2.1 类ServicedComponent 908
29.2.2 应用程序属性 908
29.2.3 创建组件 909
29.3 部署 910
29.3.1 自动部署 910
29.3.2 手工部署 910
29.4 组件服务管理工具 911
29.5 客户应用程序 913
29.6 事务处理 913
29.6.1 ACID属性 914
29.6.2 事务处理的属性 914
29.6.3 事务处理的结果 915
29.6.4 示例应用程序 915
29.7 小结 926
第30章 文件和注册表操作 927
30.1 管理文件系统 927
30.1.1 表示文件和文件夹的.NET类 928
30.1.2 Path类 930
30.1.3 示例:文件浏览器 931
30.2 移动、复制和删除文件 936
30.3 读写文件 941
30.3.1 流 941
30.3.2 读写二进制文件 942
30.3.3 读写文本文件 948
30.4 读写注册表 954
30.4.1 注册表 954
30.4.2 .NET注册表类 956
30.4.3 SelfPlacingWindow示例 958
30.5 小结 964
第31章 访问Internet 965
31.1 WebClient类 965
31.1.1 下载文件 966
31.1.2 基本的Web客户示例 966
31.1.3 上传文件 967
31.2 WebRequest类和WebResponse类 968
31.3 把输出结果显示为HTML页面 971
31.4 实用工具类 974
31.4.1 URI 974
31.4.2 IP地址和DNS名称 976
31.5 较低层的协议 978
31.6 小结 985
第32章 Windows服务 986
32.1 Windows服务 986
32.2 Windows服务的体系结构 987
32.2.1 服务程序 987
32.2.2 服务控制程序 989
32.2.3 服务配置程序 989
32.3 System.ServiceProcess命名空间 989
32.4 创建Windows服务 989
32.4.1 使用套接字的类库 990
32.4.2 TcpClient示例 994
32.4.3 Windows服务项目 996
32.4.4 线程和服务 1001
32.4.5 服务的安装 1001
32.4.6 安装程序 1001
32.5 服务的监视和控制 1006
32.5.1 MMC计算机管理 1006
32.5.2 net.exe 1007
32.5.3 sc.exe 1008
32.5.4 Visual Studio .NET Server Explorer 1009
32.5.5 ServiceController类 1009
32.6 故障排除 1015
32.6.1 交互式服务 1015
32.6.2 事件日志 1016
32.6.3 性能监视 1022
32.7 电源事件 1027
32.8 小结 1027
C#是专用于.NET平台的一种新型编程语言,不仅功能强大,而且用法灵活,利用它几乎可以开发出运行在Windows上的所有桌面应用程序和网络应用程序。2002年底,为了工作需要,我曾购买《C#入门经典》和《C#高级编程(第2版)》这两本作为参考书,并通读了这两本书。虽然我已经从事软件研发工作多年,曾阅读过很多程序设计类的图书,但是仍然觉得这两本书无论是从内容结构的安排,还是从实用性上考虑都值得推荐。其中《C#入门经典》适合那些不具备太多编程知识和经验的新手学习(此书对我来说有点浅),而《C#高级编程(第2版)》则适合我们这些有一定的编程经验但对C#了解不多的“老手”学习。在阅读《C#高级编程(第2版)》的过程中,我发现有几处翻译可能存在问题,就联系清华大学出版社的编辑,并帮助他们修订了其中的错误。自那以后,清华大学出版社的编辑就邀请我来翻译本书,出于对一本好书的出版支持与推荐,以及编辑的盛邀,我就答应抽出业余时间来翻译此书。
《C#高级编程》的第1版、第2版翻译自出版后,已帮助很多中国程序员走上了C#和.NET开发之路。第3版在前两版的基础上作了很大的改进,不仅对前两版中出现的问题给予了纠正,还增添了4章新内容,内容涉及到“部署”、“Windows 窗体”、“COM的互操作性”和 “Enterprise Services”。本书介绍了C#的基本概念,讲述了应用程序的部署和本地化的最新内容,并提供了最新版本的代码和示例。通过本书,读者可以学会如何利用面向对象的C#语言编写程序、将C#语言应用到.NET环境中,构建Windows窗体、利用ADO.NET访问数据库、编写ASP.NET组件、使用C#生成图形等知识。本书内容全面,几乎涵盖了.NET编程的方方面面,对于具备C++、Visual Basic 或J++编程经验并希望掌握C#语言的开发人员来说,本书实在是一本难得的好书。
书中论述的.NET Framework 1.1版本对.NET Framework 1.0作了一些改进,如新增了可移植性、ADO.NET中的新的数据提供程序、新语言Visual J#、并发执行和支持IPv6等特性,但大部分内容仍然适用于NET Framework 1.0。另外,.NET Framework 1.1还对Visual Studio .NET 本身进行了升级,本书使用了Visual Studio .NET 2003 IDE这个版本,因为其Intellisense的智能化程度更高、代码的自动完成功能更强。
对于原书中的一些错误,译者已经在翻译的过程中进行了修正(或许还有遗漏之处),限于水平,翻译不妥或错误之处在所难免,敬请广大读者批评指正!请将您的反馈信息发送到fwkbook@tup.tsinghua.edu.cn信箱,我们将不胜感激!
李敏波,01年获清华大学工学博士,随后在新加坡国立大学从事协同产品设计与门户的博士后研究。02年至04年在金蝶软件(中国)公司中央研究院担任高级研究员。现任复旦大学软件学院零售与分销管理系统研究中心的副主任,从事教学与科研工作。审校者简介: 黄静,计算机专业博士,在程序设计、软件工程和网络安全等方面有着多年的研究和实战经验,曾为.NET技术在国内的推广作出了重要贡献,翻译和发表了多篇有关.NET的技术文档或文章。 张少华,硕士,高级网络系统管理员。一直从事计算机网络应用和高级程序设计方面的教学、科研和开发工作,取得多项科研、学术成果,在核心期刊、国际国内会议上发表论文10余篇,编著出版教材2本、译著3本。主要研究领域包括计算机网络应用系统、网络办公系统和Web应用系统。
对于开发人员来说,把C#语言及其相关环境.NET Framework描述为多年来最重要的新技术一点都不夸张。.NET提供了一种新环境。在这个环境中,可以开发出运行在Windows上的几乎所有应用程序,而C#是专门用于.NET的新编程语言。例如,使用C#可以编写出动态Web页面、XML Web服务、分布式应用程序的组件、数据库访问组件或传统的Windows桌面应用程序。本书介绍.NET Framework 1.1,即.NET Framework的第2版,但本书的大部分内容也适用于.NET Framework 1.0。如果使用1.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组件与之通信。
Microsoft已经扩展了C++,提供了一种新语言J#,还对VB进行了很多改进,把它转变成为功能更强大的VB.NET,并允许把用这些语言编写的代码用于.NET环境。但这些语言都因有多年演化的痕迹,所以不能完全用现在的技术来编写。
本书将介绍C#编程技术,同时提供.NET体系结构工作原理的必要背景知识。我们不仅会介绍C#语言的基础,还会给出使用各种相关技术的应用程序示例,包括数据库访问、动态的Web页面、先进的图形技术和目录访问等。惟一的要求是用户至少熟悉一门在Windows上使用的高级语言,例如C++、VB或J++。
.NET的优点
前面阐述了.NET的优点,但并没有说它会使开发人员的工作更易于完成。在本节中,我们将简要讨论.NET的改进特性。
● 面向对象的编程:.NET Framework和C#从一开始就完全是基于面向对象的。
● 优秀的设计:一个基类库,它是以一种非常直观的方式设计出来的。
● 语言的无关性:在.NET中,VB.NET、C#、J#和Managed C++等语言都可以编译为通用的中间语言(Intermediate Language)。这说明,语言可以用以前没有的方式交互操作。
● 对动态Web页面的支持:ASP具有很大的灵活性,但效率不是很高,这是因为它使用了解释性的脚本语言,且缺乏面向对象的设计,从而导致ASP代码比较凌乱。.NET使用一种新技术ASP.NET,它为Web页面提供了一种集成式的支持。使用ASP.NET,可以编译页面中的代码,这些代码还可以使用.NET高级语言来编写,例如C#、J#或VB.NET。
● 高效的数据访问:一组.NET组件,总称为ADO.NET,提供了对关系数据库和各种数据源的高效访问。这些组件也可以访问文件系统和目录。.NET内置了XML支持,可以处理从非Windows平台导入或导出的数据。
● 代码共享:.NET引入了程序集的概念,替代了传统的DLL,可以完美无暇地修补代码在应用程序之间的共享方式。程序集有解决版本冲突的正式系统,程序集的不同版本可以同时存在。
● 增强的安全性:每个程序集还可以包含内置的安全信息,这些信息可以准确地指出谁或哪种类型的用户或进程可以调用什么类的哪些方法。这样就可以非常准确地控制程序集的使用方式。
● 对安装没有任何影响:有两种类型的程序集,分别是共享程序集和私有程序集。共享程序集是可用于所有软件的公共库,私有程序集只用于某个软件。私有程序集功能完备,所以安装过程非常简单,没有注册表项,只需把相应的文件放在文件系统的相应文件夹中即可。
● Web服务的支持:.NET集成了对开发Web服务的完全支持,用户可以开发出任何类型的应用程序。
● Visual Studio .NET 2003:.NET附带了一个开发环境Visual Studio .NET,它可以很好地利用C++、C#、J#、VB.NET和ASP.NET进行代码编写。Visual Studio .NET集成了Visual Studio 6环境中各种语言专用的所有最佳功能。
● C#:是使用.NET的一种面向对象的新语言。
第1章将详细讨论.NET体系结构的优点。
.NET Framework 1.1中的新增特性
.NET Framework的第1版(1.0版)在2002年发布,赢得了许多人的喝彩。.NET Framework的最新版本1.1在2003年发布,它被认为是对该架构进行了较小的改进。即使是较小的改进,新版本仍有一些非常明显的变化和新增的内容,值得我们探讨一番。
在对.NET Framework 1.1版本进行的所有改进中,Microsoft试图确保对使用1.0版本编写的代码改动尽可能少。即使做了这样的努力,但在新版本中仍有一些显著的变化。许多代码的改进是为了增强安全性。读者可以在Microsoft的GotDotNet Web站点(http://www.gotdotnet.com)上查看完整的改进列表。
下面详细论述.NET Framework 1.1版本中的一些改进和Visual Studio .NET 2003(.NET Framework 1.1的开发环境)的新增特性。
可移动性
在使用.NET Framework 1.0和Visual Studio .NET 2002时,要创建可移动应用程序,就必须下载Microsoft Mobile Internet Toolkit(MMIT)。而现在,有了.NET Framework 1.1和Visual Studio .NET 2003,就可以直接创建可移动应用程序,不需要下载其他工具包了。
在使用Visual Studio .NET 2003创建新项目时,这是显而易见的。例如,在查看可以创建的C#项目类型列表时,会看到ASP.NET Mobile Web Application和Smart Device Application。ASP.NET Mobile Web Application项目类型可以用于建立基于Web的可移动应用程序。Smart Device Application项目类型可以创建用于Pocket PC或其他Windows CE设备的应用程序。为Windows CE设备建立的第三方客户应用程序利用的是Compact Framework,这是.NET Framework的删节版本。
打开任何一种可移动项目类型,系统就会在Visual Studio .NET工具箱中列出一组可用的可移动服务器控件,然后用户就可以使用这