前言 1
第1部分 C#语言基础知识 5
第1章 C#概述 7
1.1 .NET框架 7
1.1.1 Web开发 8
1.1.2 应用程序开发 8
1.2 公共语言运行时 9
1.2.1 .NET类库 10
1.2.2 .NET编程语言 10
1.2.3 ASP.NET环境 10
1.3 C,C++和C#的发展历程 11
1.4 C#介绍 12
1.4.1 语言特性 12
1.4.2 编译C# 15
1.5 小结 17
2.2 编写Hello World!应用程序 19
第2章 编写第一个C#程序 19
2.1 选择编译器 19
2.2.1 创建类 20
2.2.2 以Main()方法开始 20
2.2.3 写到控制台 21
2.3 编译和运行程序 21
2.3.1 理解关键字和标识符 22
2.3.2 使用空白字符 23
2.4 用Main()函数开始程序 24
2.5 注释代码 25
2.5.1 使用单行注释 25
2.5.2 使用正则注释 26
2.5.3 根据注释生成XML文档 26
2.6 小结 33
3.2 指定变量的类型 35
3.1 命名变量 35
第3章 变量的使用 35
3.2.1 调整变量的大小 36
3.3 声明变量 37
3.4 使用变量的默认值 37
3.5 给变量赋值 39
3.6 使用变量数组 39
3.6.1 声明一维数组 39
3.6.2 声明多维数组 42
3.7 理解值类型和引用类型 44
3.8 转换变量类型 45
3.8.1 理解隐式转换 45
3.8.2 理解显示转换 46
3.9 使用字符串 47
3.9.1 在字符串中使用特殊字符 48
3.9.2 关闭使用字符串的特殊字符功能 48
3.10 声明枚举变量 49
3.9.3 访问字符串中的个别字符 49
3.11 小结 50
第4章 表达式 51
4.1 使用运算符 51
4.2 使用初等表达式 51
4.2.1 使用字面值 52
4.2.2 使用标识符 55
4.2.3 理解带括号的表达式 56
4.2.4 用成员访问表达式调用方法 56
4.2.5 用调用表达式调用方法 57
4.2.6 用元素访问表达式指定数组元素 57
4.2.7 用this关键字访问对象 58
4.2.8 用base关键字访问对象 59
4.2.9 使用后缀方式的增1和减1运算符 59
4.2.10 用new运算符创建新的引用类型 59
4.2.11 用typeof运算符返回类型信息 59
4.2.12 使用checked和unchecked运算符 60
4.3 理解一元表达式 61
4.3.1 用一元加法运算符返回操作数的值 62
4.3.2 用一元减法运算符返回操作数的值 62
4.3.3 用逻辑求反运算符取反布尔型表达式 62
4.3.4 理解按位求反运算符 62
4.3.5 前缀方式的增1和减1运算符 63
4.4 理解算术运算符 64
4.4.1 用赋值运算符赋新值 64
4.4.2 使用乘法运算符 64
4.4.3 使用除法运算符 65
4.4.4 使用取余运算符 66
4.4.5 使用加法运算符 66
4.4.6 使用减法运算符 67
4.5 理解移位运算符 67
4.5.1 用左移位运算符移动位 67
4.5.2 用右移位运算符移动位 68
4.5.3 用关系运算符比较表达式 69
4.5.4 用相等运算符测试相等性 69
4.5.5 用不等运算符测试不等性 69
4.5.6 用小于运算符测试值 69
4.5.7 用大于运算符测试值 70
4.5.8 用小于等于运算符测试值 70
4.5.9 用大于等于运算符测试值 70
4.6 理解整数逻辑运算符 71
4.6.1 用与运算符计算布尔值 71
4.6.2 用异或运算符计算布尔值 71
4.6.3 用或运算符计算布尔值 71
4.7 理解条件逻辑运算符 72
4.7.1 用条件与运算符比较布尔值 72
4.7.2 用条件或运算符比较布尔值 72
4.7.3 用条件逻辑运算符比较布尔值 72
4.8 理解运算的次序 73
4.9 小结 74
第5章 控制代码的流程 75
5.1 C#中的语句 75
5.1.1 使用语句声明局部变量 76
5.1.2 使用选择语句选择代码分支 77
5.1.3 使用循环语句执行嵌入语句 80
5.1.4 使用转向语句以便转向代码中的其他地方 84
5.1.5 使用语句执行安全的数学计算 86
5.2 小结 87
第6章 方法 89
6.1 理解方法结构 89
6.1.1 返回类型 89
6.1.4 方法体 90
6.2 调用方法 90
6.1.2 方法名称 90
6.1.3 参数表 90
6.3 理解参数类型 94
6.3.1 输入参数 94
6.3.2 输出参数 95
6.3.3 引用参数 96
6.3.4 参数数组 97
6.4 重载方法 99
6.5.1 覆盖方法 100
6.5 虚拟方法 100
6.6 小结 102
第7章 使用结构组合数据 103
7.1 声明结构 103
7.2 在代码中使用结构 105
7.3 在结构中定义方法 106
7.3.1 使用构造函数方法 106
7.3.2 调用结构中的方法 109
7.4 在结构中定义属性 110
7.5 在结构中定义索引器 112
7.6 在结构中定义接口 113
7.7 使用C#的基本类型作为结构 114
7.8 小结 115
第2部分 利用C#进行面向对象的编程 117
第8章 编写面向对象的代码 119
8.1 类和对象 120
8.2 面向对象软件设计的述评 121
8.2.1 提取 121
8.2.2 抽象数据类型 122
8.2.3 封装 123
8.2.4 继承 124
8.2.5 多态性 126
8.3 小结 128
9.1 声明一个类 131
第9章 C#类 131
9.2 理解Main方法 132
9.2.1 使用命令行参数 132
9.2.2 返回值 133
9.3 理解类值 134
9.3.1 使用常量 134
9.3.2 使用字段 135
9.3.3 方法的使用 136
9.3.4 属性的使用 136
9.3.5 使用事件 140
9.3.6 使用索引器 140
9.3.7 使用运算符 144
9.3.8 使用构造函数 144
9.3.9 使用析构函数 146
9.3.10 使用类的类型 148
9.4 使用关键字this作为标识符 148
9.5.1 使用静态字段 149
9.5 理解静态修饰符 149
9.5.2 使用静态常量 151
9.5.3 使用静态方法 151
9.6 小结 153
第10章 重载运算符 155
10.1 可重载一元运算符 155
10.1.1 重载一元加 156
10.1.2 重载一元减 158
10.1.3 重载按位补数 159
10.1.4 重载先递增 160
10.1.5 重载先递减 161
10.1.6 重载true和false运算符 162
10.2 可重载二元运算符 164
10.3 重载转换运算符 167
10.4 不能重载的运算符 168
10.5 小结 168
第11章 类继承 171
11.1 编译多个类 172
11.2 在C#中指定基类 172
11.3 作用域 173
11.4 重用派生类成员标识符 174
11.5 使用继承的方法 176
11.5.1 虚拟和覆盖方法 176
11.6 多态性 177
11.6.1 抽象方法 179
11.7 基类:使用继承的属性和索引器 180
11.7.1 使用关键字base 180
11.7.2 用关键字base访问基类字段 181
11.8 密封类 181
11.9 包含和委托 182
11.10 .NET的object类 188
11.11 使用装箱和取消装箱技术转换object类型 189
11.12 小结 190
第3部分 高级C# 193
第12章 名字空间 195
12.1 声明名字空间 195
12.2 在多个源文件中声明一个名字空间 197
12.3 使用名字空间中的类 197
12.4 利用using关键字辅助名字空间的使用 199
12.4.1 用using关键字命名类的别名 199
12.4.2 用using关键字声明名字空间指令 201
12.5 快速浏览.NET的名字空间 203
12.6 小结 204
第13章 接口 205
13.1 定义接口 206
13.1.1 定义接口方法 206
13.1.2 定义接口属性 207
13.1.3 定义接口索引器 207
13.2 从基接口派生接口 208
13.1.4 定义接口事件 208
13.3 使用new关键字重复使用标识符 209
13.4 在类和结构中实现接口 210
13.5 实现具有相同名称的接口方法 211
13.6 访问接口成员 212
13.6.1 查询对象是否支持某个接口 213
13.6.2 在对象上访问某个接口 215
13.7.1 支持foreach与IEnumerable和IEnumerator的结合使用 217
13.7 实现NET框架定义的接口 217
13.6.3 理解接口声明和作用域关键字 217
13.7.2 支持用IDisposable清除对象 221
13.8 小结 223
第14章 枚举 225
14.1 声明枚举 226
14.2 使用枚举 228
14.3 在枚举值上使用运算符 229
14.4.1 检索枚举名称 231
14.4 使用NET的System.Enum类 231
14.4.2 比较两个枚举值 233
14.4.3 在运行时发现基础类型 234
14.4.4 检索所有枚举值 234
14.4.5 分析字符串以便检索枚举值 235
14.5 小结 235
第15章 事件和委托 237
15.1 定义委托 237
15.2 定义事件 238
15.3 安装事件 239
15.4 激发事件 239
15.5 整个代码清单 239
15.6 标准化事件的设计 241
15.7 使用事件访问器函数 243
15.8 使用事件修饰符 244
15.8.1 static事件 244
15.9 小结 245
15.8.4 abstract事件 245
15.8.2 virtual事件 245
15.8.3 override事件 245
第16章 异常处理 247
16.1 指定异常处理 248
16.2 捕获异常 248
16.2.1 使用try关键字 249
16.2.2 捕获特定类的异常 249
16.2.3 出现异常之后进行清除 250
16.3 理解异常类 251
16.4 由NET框架定义的异常 251
16.4.1 OutOfMemoryException异常 251
16.4.2 StackOverflowException异常 252
16.4.3 NullReferenceException异常 253
16.4.6 ArrayTypeMismatchException异常 254
16.4.5 InvalidCastException异常 254
16.4.4 TypelnitializationException异常 254
16.4.7 IndexOutOfRangeExeeption异常 255
16.4.8 DivideByZeroException异常 255
16.4.9 OverflowException异常 255
16.5 使用自定义的异常 256
16.5.1 自定义异常 256
16.5.2 抛出自定义的异常 257
16.5.3 在构造函数和属性中使用异常 258
16.6 小结 260
第17章 属性 261
17.1 属性概述 261
17.2 使用.NET框架提供的属性 263
17.2.1 System.Diagnosties.ConditionalAltribute类 264
17.2.2 System.SerializableAttribute类 266
17.2.3 System.ObsoleteAttribute类 268
17.3.1 限制属性的用法 269
17.3 自定义属性类 269
17.3.2 允许多属性值 270
17.3.2 设置属性参数 271
17.3.4 举例说明属性类 272
17.4 小结 274
第18章 类的版本升级 275
18.1 版本升级问题 275
18.2 解决版本升级问题 277
18.2.1 使用new修饰符 277
18.2.2 使用override修饰符 279
18.3 小结 280
第19章 不安全代码 281
19.1 理解指针的基础知识 282
19.1.1 理解指针类型 283
19.2 编译不安全代码 283
19.2.1 在不安全模式下指定指针 284
19.2.2 通过指针访问成员的值 285
19.3 使用指针将变量的值固定到特定的地址 285
19.3.1 理解指针数组元素语法 286
19.3.2 比较指针 287
19.3.3 理解指针运算 287
19.3.4 使用sizeof运算符 288
19.4 从堆栈中分配内存 288
19.5 小结 289
第20章 高级C#构造 291
20.1 理解隐式运算符和非法类型转换 291
20.2 理解结构的初始化 293
20.2.1 初始化结构 293
20.2.2 解决有关初始化的问题 294
20.3 理解派生类 295
20.3.2 解决传递派生类时产生的问题 296
20.3.1 传递派生类 296
20.4 使用非整数作为数组元素 297
20.5 小结 299
第4部分 使用C#制定.NET解决方案 301
第21章 创建WindowsForms应用程序 303
21.1 理解WindowsForms体系结构 303
21.1.2 Application类 304
21.2 创建第一个WindowsForms应用程序 304
21.1.1 Form类 304
21.3 编译WindowsForms应用程序 305
21.4 理解程序集:为WindowsForms应用程序增加版本信息 306
21.4.1 AssemblyTitle属性 307
21.4.2 AssemblyDeseription属性 307
21.4.3 AssemblyConfiguration属性 307
21.4.4 AssemblyCompany属性 307
21.4.5 AssemblyProduct属性 307
21.4.8 AssemblyCulture属性 308
21.4.7 AssemblyTrademark属性 308
21.4.6 AssemblyCopyright属性 308
21.4.9 AssemblyVersion属性 309
21.5 对Application对象的进一步认识 310
21.5.1 理解Application事件 310
21.5.2 在程序中使用事件 310
21.5.3 使用Application属性 312
21.5.4 理解Application方法 315
21.6 为窗体增加控件 320
21.6.1 理解控件类的层次 321
21.6.2 在窗体上使用控件 322
21.7 使用资源 323
21.7.1 使用字符串资源 323
21.7.2 使用二进制资源 325
21.8 小结 326
22.1 ASP.NET Web应用程序的基本知识 327
第22章 使用WebForm创建Web应用程序 327
22.1.1 ASP.NET的新特性 328
22.1.2 WebForm中的常用控件 329
22.2 创建和配置Web应用程序 333
22.2.1 创建一个新项目 333
22.2.2 为WebForm添加控件 335
22.2.3 事件处理 338
22.3 小结 342
第23章 使用ADO.NET进行数据库编程 343
23.1 理解Dataset类和相关类 344
23.2 理解OLE DB和SQL Server支持 344
23.3 理解使用ADO.NET进行常用的数据库操作 345
23.3.1 不返回行的操作 346
23.3.2 仅返回一行的操作 350
23.3.3 仅影响一行的操作 354
23.3.4 返回多行的数据操作 361
23.3.5 影响多行的数据操作 363
23.3.6 返回数据结构的操作 365
23.4 小结 369
第24章 使用文件和Windows注册表 371
24.1 访问文件 371
24.1.1 访问二进制文件 371
24.1.2 监控文件变化 374
24.1.3 操作文件 378
24.2 访问注册表 382
24.2.1 读注册表键值 382
24.2.2 写注册表键值 383
24.2.3 枚举注册表键值 386
24.3 小结 387
第25章 访问数据流 389
25.1 理解数据I/O类的继承关系 389
25.1.1 使用流 389
25.1.2 使用writer类 389
25.2.1 理解同步I/O 391
25.1.3 使用reader类 391
25.2 操作流 391
25.2.2 理解异步I/O 395
25.3 理解writer类和reader类 400
25.3.1 使用Binary Writer将数据写到流 400
25.3.2 使用BinaryReader从流中读数据 402
25.4 使用XmlWriter流编写合格的XML 403
25.5 小结 404
第26章 使用GDI+绘图 405
26.1 使用Graphics对象 405
26.2 在GDI+中使用图像 410
26.3 使用画笔和刷子 413
26.3.1 使用Pen类 413
26.3.2 使用Brush类 415
26.4 小结 418
27.1 理解Web服务的工作原理 419
第27章 创建Web服务 419
27.2 Web服务和Visual Studio.NET 421
27.3 理解Web服务描述语言(WSDL) 423
27.4 使用SOAP 425
27.5 使用Visual Studio.NET创建Web服务 426
27.6 使用Visual Studio.NET来访问一个Web服务 429
27.7 小结 431
第28章 在ASP.NET中使用C# 433
28.1 创建Web服务 433
28.1.1 为Web服务创建一个数据库 434
28.1.2 使用ASP.NET Web服务模板 437
28.1.3 为Web服务添加数据控件 438
28.1.4 为Web服务编码 440
28.2 创建Web服务客户端 442
28.2.1 创建一个新的ASP.NET Web应用程序项目 442
28.2.3 实现Web服务的方法 443
28.2.2 添加一个Web引用 443
28.3 部署应用程序 446
28.3.1 Visual Studio.NET中的部署模式 446
28.3.2 使用部署模式来部署一个应用程序 447
28.3.3 使用拷贝模式选项来部署一个项目 448
28.4 小结 448
第29章 创建自定义控件 449
29.1 理解Windows控件库 449
29.1.1 属性 449
29.1.2 方法 451
29.1.3 字段 452
29.1.4 事件 452
29.2 通过示例学习知识 452
29.2.1 创建一个倒数计时器 452
29.2.2 创建一个倒数计时器测试工具 456
29.3.1 创建风寒指数计算类 458
29.3 使用一个类库 458
29.4 小结 461
第30章 创建移动应用程序 463
30.1 理解无线Web 463
30.1.1 介绍Mobile Internet Toolkit 463
30.1.2 理解仿真器 464
30.2 创建一个年龄计算器 464
30.3 理解移动设备的性能 468
30.4 理解移动控件的工作原理 469
30.4.1 使用Calendar控件 469
30.4.2 使用Image控件 470
30.5 在移动设备上分页 471
30.6 小结 472
第5部分 C#与.NET框架 473
31.1 程序集 475
第31章 程序集 475
31.1.1 找到已加载的程序集 476
31.1.2 程序集强名称 477
31.1.3 使用程序集类 480
31.2 生成用于程序集的本地代码 485
31.3 小结 486
32.1 Type类 487
32.1.1 检索类型信息 487
第32章 反射 487
32.1.2 查询对象 490
32.1.3 通过Reflection生成动态代码 492
32.2 小结 495
第33章 C#线程 497
33.1 线程 497
33.1.1 占先式多任务 498
33.1.2 线程优先级和锁定 498
33.1.3 对称多处理 498
33.1.4 使用资源:多多益善 499
33.1.5 应用程序域 500
33.1.6 多线程应用程序的益处 500
33.2 创建多线程应用程序 501
33.2.1 创建新线程 501
33.2.2 线程优先级 504
33.2.3 线程状态 505
33.3 轮询与监听 510
33.4 小结 511
第34章 COM 513
34.1 介绍运行时可调用包装 513
34.2 从COM组件创建.NET程序集 514
34.2.1 使用实用工具Tlbimp 515
34.2.2 直接从C#引用COM DLL 522
34.3 处理Intemp错误 523
34.4 使用平台调用 525
34.5 小结 526
第35章 COM+服务 527
35.1 名字空间System.EnterpriseServices 527
35.2 ServieedComponent类 529
35.3 利用COM+注册类 530
35.4 使用用于COM+类的属性 533
35.4.1 ApplicationAccessControl 533
35.4.2 ApplicationActivation 533
35.4.3 ApplicationID 533
35.4.4 ApplicationName 533
35.4.5 ApplicationQueuing 534
35.4.6 AutoComplete 534
35.4.7 ComponentAccessControl 534
35.4.8 ConstructionEnabled 535
35.4.9 JustInTimeActivation 535
35.4.10 LoadBalancingSupported 535
35.5.1 各种ACID属性 536
35.4.11 SecurityRole 536
35.5 处理事务 536
35.5.2 编写事务性组织 537
35.6 访问对象上下文 538
35.7 小结 540
第36章 .NET远程处理 541
36.1 介绍远程处理 541
36.2 创建远程主机程序集 543
36.3 建立远程处理服务器 544
36.3.1 指定信道和端口 545
36.3.2 指定信道格式 546
36.3.3 激活远程对象 547
36.4 编写远程处理客户端程序 553
36.5 小结 556
37.1.1 代码安全策略 558
37.1.2 代码权限 558
37.1 代码安全性 558
37.2 用户安全性 559
37.3 .NET与基于角色的安全性 560
37.3.1 分配Windows角色 561
37.3.2 principal 563
37.4 代码访问权限 563
37.4.1 创建简单的权限代码请求 564
37.4.2 拒绝权限 565
37.4.3 使用基于属性的权限 566
37.5 安全策略 567
37.5.1 安全策略的级别 567
37.5.2 代码组 567
37.5.3 已命名的权限集 568
37.5.4 改变安全策略 568
37.6 小结 569
附录A XML基础知识 571