目录译者序序一序二前言第一部分C#类的基本原理第1章 建立C#应用程序和库 2
1.1 “Hello,World”——命令行版本 2
1.2 “Hello,World”的代码解释 4
1.2.1一站式编程 4
1.2.2名称空间 4
1.2.3类和成员 6
1.2.4 Main方法 6
1.2.5 System.Console.WriteLine方法 7
1.2.6名称空间和using指令 7
1.2.7框架代码 8
1.2.8类的二义性 9
1.3“Hello,World”——Visual Studio.NET版本 10
1.4编译和运行.NET应用程序 11
1.5 “Hello,World”内部 13
1.6配件和模块 16
1.6.1配件概述 16
1.6.2配件的好处 17
1.6.3构建配件 18
1.6.4创建共享配件 21
1.6.5使用全局配件缓存 23
1.7小结 24
第2章 .NET类型系统 25
2.1所有东西都是对象 25
2.2.1值类型 27
2.2值类型和引用类型 27
2.3装箱和拆箱 28
2.2.2引用类型 28
2.3.1将值类型转换为引用类型 29
2.3.2将引用类型转换为值类型 29
2.3.3更多的装箱例子 30
2.4类型和别名 34
2.5类型之间的转换 34
2.6 CTS的好处 36
2.6.1语言互操作性 36
2.6.3类型安全 37
2.7小结 37
2.6.2单根的对象层次结构 37
第3章 类和结构 38
3.1定义类 38
3.2类成员 39
3.3访问修饰符 40
3.4 Main方法 41
3.4.1命令行参数 41
3.4.2从Main方法返回值 42
3.4.3多个Main方法 43
3.5构造器 44
3.5.1静态成员和实例成员 46
3.5.2构造器初始化器 47
3.5.3在构造器初始化器中指定运行时信息 51
3.6常量与只读字段 54
3.6.1常量 54
3.6.2只读字段 54
3.7继承 57
3.7.1多个接口 59
3.7.2封闭的类 60
3.8在C#中定义结构 61
3.8.1结构的使用 61
3.8.2使用结构的原则 63
3.9小结 65
4.1值和引用参数 66
第4章 方法 66
4.1.1 ref方法参数 67
4.1.2 out方法参数 70
4.2再论值和引用参数 73
4.3方法重载 77
4.3.1重载构造器 79
4.3.2继承与重载 81
4.4可变的方法参数 82
4.5虚拟方法 85
4.5.1方法重定义 85
4.5.2多态性 86
4.5.3 new和虚拟方法 91
4.5.4从构造器调用虚拟方法 93
4.6静态方法 95
4.6.1访问类成员 96
4.6.2静态构造器 97
4.7小结 98
第5章 特性、数组和索引器 99
5.1特性是灵巧字段 99
5.1.1定义和使用特性 100
5.1.2特性的内幕 101
5.1.3继承特性 104
5.1.4特性的高级用途 108
5.2数组 109
5.2.1声明数组 109
5.2.2一维数组示例 110
5.2.3多维数组 111
5.2.4查询秩 112
5.2.5锯齿形数组 113
5.3使用索引器像对待数组那样对待对象 115
5.3.1定义索引器 115
5.3.2索引器例子 116
5.3.3索引器的内幕 117
5.3.4设计原则 118
5.4小结 119
第6章 属性 120
6.1属性简介 120
6.2定义属性 121
6.3.1类属性 124
6.3查询属性 124
6.3.2方法属性 126
6.3.3字段属性 128
6.4属性参数 129
6.4.1位置参数和命名参数 130
6.4.2使用命名过的参数时的常见错误 131
6.4.3有效的属性参数类型 132
6.5 AttributeUsage属性 132
6.5.1定义属性目标 132
6.5.2单次使用和多次使用的属性 134
6.5.3指定属性继承规则 134
6.6属性标识符 136
6.7预定义的属性 138
6.7.1 Conditional属性 139
6.7.2 Obsolete属性 141
6.7.3 CLSCompliant属性 141
6.7.4 Dlllmport和StructLayout属性 142
6.7.5配件属性 144
6.8上下文属性 144
6.9小结 150
第7章 接口 151
7.1接口的用途 151
7.2声明接口 152
7.3实现接口 153
7.3.1使用is查询实现 155
7.3.2使用as查询实现 158
7.3.3接口与替代技术 161
7.4显式地限定接口成员名 163
7.4.1用接口进行名称隐藏 163
7.4.2避免名称的二义性 165
7.5接口与继承 169
7.6组合接口 172
7.7小结 173
第二部分编写代码第8章 表达式和操作符 176
8.1操作符的定义 176
8.2操作符的优先级 176
8.2.2左结合性和右结合性 177
8.2.1 c#如何决定优先级 177
8.2.3实际使用 178
8.3 c#操作符 178
8.3.1基本表达式操作符 179
8.3.2算术操作符 183
8.4数值转换 190
8.5位操作符 193
8.6关系操作符 196
8.7简单赋值操作符 197
8.8条件操作符 200
8.9小结 202
9.1选择语句 203
9.1.1 if语句 203
第9章 程序流控制 203
9.1.2 switch语句 207
9.2迭代语句 214
9.2.1 while语句 214
9.2.2 do/while语句 215
9.2.3 for语句 217
9.2.4 foreach语句 220
9.3使用跳转语句进行分支 223
9.3.1 break语句 223
9.3.2 continue语句 225
9.3.3声名狼藉的goto语句 227
9.3.4 return语句 232
9.4小结 233
第10章 字符串处理和正则表达式 234
10.1字符串 234
10.1.1字符串的格式化 236
10.1.2格式指定符 238
10.1.3对象和ToString 240
10.1.4数字字符串分析 241
10.1.5字符串和DateTime 243
10.1.6字符串的编码方式 245
10.1.7 StringBuilder类 246
10.1.8分解字符串 247
10.1.9扩展字符串 248
10.1.10字符串扣留 249
10.2正则表达式 251
10.2.1 Match和MatchCollection 254
10.2.2组和捕获 257
10.2.3字符串-修改表达式 258
10.2.4正则表达式选项 261
10.2.5编译正则表达式 262
10.3小结 265
第11章 用流进行文件I/O 266
11.1 流类 266
11.1.1 FileStream 267
11.1.2 StreamReader和StreamWriter 269
11.1.3内存和缓冲流 271
11.1.4字符串读取器和写出器 274
11.1.5二进制读取器和写出器 275
11.2文件系统类 277
11.2.1 Directory和DirectoryInfo 277
11.2.2 File和FileInfo 279
11.2.3分析路径 281
11.3流的非控制台使用方式 282
11.3.1 Windows OpenFileDialog 282
11.3.2读取Web页面 283
11.4串行化 284
11.4.1使用BinaryFormatter进行串行化 285
11.4.2使用SoapFormatter 287
11.4.3使用XmlSerializer进行串行化 288
11.4.4实现ISerializable 289
11.5小结 291
第12章 用异常进行错误处理 292
12.1异常处理概述 292
12.2基本的异常处理语法 293
12.2.1抛出异常 293
12.2.2捕获异常 294
12.2.3重新抛出一个异常 296
12.2.4使用finally进行清理 298
12.3重试代码 301
12.4错误处理技术的比较 303
12.4.1异常处理相对于返回编码的好处 303
12.4.2在正确的上下文中处理错误 305
12.4.3提高代码的可读性 306
12.4.4从构造器抛出异常 307
12.5使用System.Exception类 307
12.5.1构造一个Exception对象 307
12.5.2使用StaekTrace特性 310
12.5.3捕获多个异常类型 311
12.5.4派生自己的Exception类 312
12.6用异常处理设计代码 314
12.6.1 try块的设计问题 314
12.6.2 catch块的设计问题 317
12.7小结 319
13.1操作符重载 320
13.1.1操作符重载的语法 320
第13章 操作符重载和用户定义的转换 320
13.1.2操作符重载的规则和限制 321
13.1.3操作符重载示例 322
13.1.4 RGB颜色递增示例 324
13.1.5操作符重载的设计方针 328
13.2用户定义的转换 330
13.2.1用户定义的转换语法 330
13.2.2用户定义的转换的规则和限制 330
13.2.3用户定义的转换示例 331
13.3小结 341
第14章 委托和事件处理器 342
14.1将委托作为回调方法使用 342
14.2委托的内幕 344
14.3将委托定义为静态成员 347
14.4只在需要时创建委托 349
14.5多点委托 351
14.6使用多点委托定义事件 359
14.7小结 362
第15章 使用XML进行文档记录 363
15.1入门 363
15.1.1添加元素 365
15.1.2可以接受注释的代码构造 365
15.2编译器产生的元素ID 365
15.2.1字段、特性、事件和索引器 366
15.2.2方法 368
15.3 良构的XML 372
15.4注释网页 373
15.5元素标记和属性 374
15.5.1〈exception〉标记和cref属性 375
15.5.2 〈c〉、〈code〉和〈example〉标记 375
15.5.3〈include〉标记 376
15.5.4 〈list〉标记 378
15.6定制的格式化 379
15.7 XML与数据 381
15.8 小结 382
第三部分高级C#第16章 数值处理和Marh类 384
16.1 C#和.NET中的数值支持 384
16.1.1 Decimal类型是原始的类型吗 385
16.1.2数值后缀 386
16.1.3数值类型的各种名称 387
16.1.4数值字面值 388
16.2整数范围和溢出规则 390
16.3 Decimal类型 394
16.4 System.Math类 394
16.4.1 System.Math常量 394
16.4.2处理数值的正负号 394
16.4.3最小值和最大值 395
16.4.4用于取整和截短的方法 395
16.5小结 396
17.1实现枚举接口 397
第17章 集合和对象枚举 397
17.1.1使用枚举器对象 400
17.1.2使用foreach语句处理集合 401
17.2为什么需要两个接口 403
17.3构造枚举器对象 403
17.4创建具有版本的枚举器 404
17.5将IEnumerable和IEnumerator合并 407
17.6在允许枚举时保护数据 409
17.7值类型 411
17.7.1性能问题 412
17.7.2修改值类型的集合数据 419
17.8小结 422
18.1线程入门 423
第18章 多线程和异步编程 423
18.2线程处理的基本知识 424
18.2.1创建线程和Thread对象 424
18.2.2管理线程的生存周期 424
18.2.3销毁线程 426
18.2.4对线程进行调度 428
18.3与线程进行数据通信 432
18.4线程安全和同步 434
18.4.1使用Monitor类保护代码 434
18.4.2通过C#lock语句使用监视锁 440
18.4.3使用Mutex类对代码进行同步 441
18.5使用委托调用异步方法 443
18.7.1何时应该使用线程 447
18.6线程安全和.NET类 447
18.7线程方针 447
18.7.2何时不应该使用线程 448
18.8小结 449
第19章 利用反射查询元数据 450
19.1 ReflectionAPI层次结构 450
19.2rype类 450
19.3获得Type引用 450
19.3.1获取一个实例的类型 451
19.3.2从名称获取类型 451
19.3.3查询类型 452
19.4.1遍历配件的类型 455
19.4处理配件和模块 455
19.4.2列出配件的模块 459
19.5使用反射进行晚绑定 461
19.6使用反射实现抽象工厂 463
19.7动态地生成代码 465
19.8小结 468
第20章 固定和内存管理 469
20.1垃圾收集 469
20.2重定义Finalize 470
20.3强行进行垃圾收集 474
20.4 Dispose模式 476
20.5 IDisposable接口 479
20.5.1派生的可处置类 481
20.5.2防止重复处置 482
20.5.3对Dispose的语言支持 483
20.6垃圾收集器代 484
20.7弱引用 486
20.8不安全的代码 487
20.9固定 490
20.9.1固定数组元素 492
20.9.2间接引用成员操作符 495
20.9.3使用stackalloc 496
20.10 小结 498
第21章 从C#应用程序使用COM 499
21.1 COM在当今的.NET环境中处于什么位置 499
21.2.1创建ATL组件 500
21.2从C#使用COM组件 500
21.2.2从.NET应用程序使用COM组件 501
21.2.3绑定和使用COM组件 502
21.2.4使用COM组件进行动态类型发现 504
21.2.5对COM对象进行晚绑定 505
21.3事件处理 507
21.3.1 COM连接点的工作原理 507
21.3.2创建一个产生事件的ATLCOM组件 508
21.3.3使用委托进行事件处理 510
21.3.4在.NET应用程序中接收非托管的COM事件 512
21.4使用COM集合 515
21.4.1使用ATL创建COM集合对象 515
21.4.2在.NET应用程序中使用COM集合 519
21.4.3遍历.NET集合中的元素 520
21.5在托管代码中重用COM组件 522
21.5.1包含 522
21.5.2聚合 522
21.5.3通过混合模式的继承进行重用 523
21.5.4通过混合模式的包含进行重用 526
21.5.5NET对COM线程模型和场所的感知 527
21.6将方法关键字映射到IDL属性 528
21.7小结 529
第22章 在非托管代码中使用.NET组件 530
22.1通过COM创建和使用.NET组件 530
22.1.1从配件产生类型库和注册配件 531
22.1.2从Visual Basic 6客户使用组件 532
22.1.3 COM interop的内部机理 533
22.1.4探究产生的类型库 534
22.2使用属性影响产生的类型库元数据 540
22.2.1修改接口类型 540
22.2.2修改GUID和ProgID 542
22.2.3对COM隐藏公共类型 543
22.2.4修改类型的编组行为 544
22.3异常处理:.NET与COM 544
22.4在非托管事件接收器中处理来自.NET组件的事件 546
22.4.1创建产生事件的.NET组件 547
22.4.2在Visual Basic客户应用程序中处理事件 549
22.5.NET组件中的线程从属关系 550
22.6小结 555
第23章 安全性 556
23.1.NET安全性 556
23.2可检验的类型安全 557
23.3代码签名 561
23.3.1私有配件 561
23.3.2强名称配件 563
23.3.3全局配件缓存 566
22.3.4延迟签名配件 568
23.4密码服务 569
23.5.1证据 571
23.5代码访问安全性 571
23.5.2安全策略 572
23.5.3配置安全 575
23.5.4 CASpol 579
23.5.5强制式和声明式CAS 581
23.5.6标识权限 582
23.5.7配件权限请求 584
23.6基于角色的安全 585
23.6.1 PrincipalPermission请求 587
23.6.2模仿 588
23.7隔离的存储 589
23.8小结 590
附录A MSIL指令表 592