第一篇 C#1.0 1
第1章 C#简介 3
1.1 Hello World 4
1.2 程序结构 5
1.3 类型和变量 7
1.4 表达式 11
1.5 语句 14
1.6 类和对象 18
1.6.1 成员 18
1.6.2 可访问性 19
1.6.3 基类 20
1.6.4 域 20
1.6.5 方法 21
1.6.6 其他函数成员 29
1.7 结构 34
1.8 数组 35
1.9 接口 37
1.10 枚举 39
1.11 委托 40
1.12 特性 42
第2章 词法结构 45
2.1 程序 45
2.2 文法 45
2.2.1 文法表示法 45
2.2.2 词法文法 47
2.2.3 句法文法 47
2.3 词法分析 47
2.3.1 行终结符 48
2.3.2 空白 49
2.3.3 注释 49
2.4 标记 51
2.4.1 Unicode字符转义序列 51
2.4.2 标识符 52
2.4.3 关键字 54
2.4.4 字面值 55
2.4.5 运算符和标点 61
2.5 预处理指令 61
2.5.1 条件编译符号 63
2.5.2 预处理表达式 64
2.5.3 声明指令 64
2.5.4 条件编译指令 66
2.5.5 诊断指令 69
2.5.6 区域指令 69
2.5.7 行指令 70
第3章 基本概念 73
3.1 应用程序启动 73
3.2 应用程序终止 74
3.3 声明 75
3.4 成员 77
3.4.1 命名空间成员 78
3.4.2 结构成员 78
3.4.3 枚举成员 79
3.4.4 类成员 79
3.4.5 接口成员 79
3.4.6 数组成员 79
3.4.7 委托成员 79
3.5 成员访问 79
3.5.1 已声明可访问性 80
3.5.2 可访问域 81
3.5.3 实例成员的受保护访问 84
3.5.4 可访问性约束 85
3.6 签名和重载 86
3.7 范围 87
名称隐藏 90
3.8 命名空间和类型名称 93
完全限定名 94
3.9 自动内存管理 95
3.10 执行顺序 99
第4章 类型 101
4.1 值类型 101
4.1.1 System.ValueType类型 102
4.1.2 默认构造函数 103
4.1.3 结构类型 104
4.1.4 简单类型 104
4.1.5 整型 105
4.1.6 浮点型 107
4.1.7 decimal类型 108
4.1.8 bool类型 109
4.1.9 枚举类型 109
4.2 引用类型 110
4.2.1 类类型 110
4.2.2 对象类型 111
4.2.3 string类型 111
4.2.4 接口类型 111
4.2.5 数组类型 112
4.2.6 委托类型 112
4.3 装箱和拆箱 112
4.3.1 装箱转换 112
4.3.2 拆箱转换 114
第5章 变量 115
5.1 变量类别 115
5.1.1 静态变量 116
5.1.2 实例变量 116
5.1.3 数组元素 116
5.1.4 值参数 117
5.1.5 引用参数 117
5.1.6 输出参数 117
5.1.7 局部变量 118
5.2 默认值 119
5.3 明确赋值 119
5.3.1 初始已赋值变量 120
5.3.2 初始未赋值变量 121
5.3.3 确定是否明确赋值的细则 121
5.4 变量引用 133
5.5 变量引用的原子性 133
第6章 转换 135
6.1 隐式转换 135
6.1.1 标识转换 136
6.1.2 隐式数值转换 136
6.1.3 隐式枚举转换 136
6.1.4 隐式引用转换 136
6.1.5 装箱转换 137
6.1.6 隐式常量表达式转换 137
6.1.7 用户自定义的隐式转换 137
6.2 显式转换 138
6.2.1 显式数值转换 138
6.2.2 显式枚举转换 140
6.2.3 显式引用转换 141
6.2.4 拆箱转换 142
6.2.5 用户自定义的显式转换 142
6.3 标准转换 142
6.3.1 标准隐式转换 142
6.3.2 标准显式转换 142
6.4 用户自定义的转换 143
6.4.1 允许的用户自定义转换 143
6.4.2 用户自定义转换的计算 143
6.4.3 用户自定义的隐式转换 144
6.4.4 用户自定义的显式转换 145
第7章 表达式 147
7.1 表达式的分类 147
表达式的值 148
7.2 运算符 149
7.2.1 运算符的优先级和结合性 149
7.2.2 运算符重载 151
7.2.3 一元运算符重载决策 153
7.2.4 二元运算符重载决策 153
7.2.5 候选用户自定义运算符 154
7.2.6 数值提升 154
7.3 成员查找 156
基类型 157
7.4 函数成员 157
7.4.1 自变量列表 162
7.4.2 重载决策 165
7.4.3 函数成员调用 168
7.5 基本表达式 170
7.5.1 字面值 170
7.5.2 简单名称 171
7.5.3 带括号的表达式 173
7.5.4 成员访问 173
7.5.5 调用表达式 176
7.5.6 元素访问 178
7.5.7 this访问 180
7.5.8 base访问 181
7.5.9 后缀增量和后缀减量运算符 181
7.5.10 new运算符 183
7.5.11 typeof运算符 189
7.5.12 checked和unchecked运算符 190
7.6 一元运算符 193
7.6.1 一元加运算符 193
7.6.2 一元减运算符 194
7.6.3 逻辑求反运算符 195
7.6.4 按位求补运算符 195
7.6.5 前缀增量和减量运算符 195
7.6.6 强制转换表达式 197
7.7 算术运算符 198
7.7.1 乘法运算符 198
7.7.2 除法运算符 199
7.7.3 余数运算符 201
7.7.4 加法运算符 202
7.7.5 减法运算符 205
7.8 移位运算符 207
7.9 关系和类型测试运算符 209
7.9.1 整数比较运算符 210
7.9.2 浮点比较运算符 210
7.9.3 小数比较运算符 211
7.9.4 布尔相等运算符 212
7.9.5 枚举比较运算符 212
7.9.6 引用类型相等运算符 212
7.9.7 字符串相等运算符 214
7.9.8 委托相等运算符 214
7.9.9 is运算符 215
7.9.10 as运算符 216
7.10 逻辑运算符 216
7.10.1 整数逻辑运算符 217
7.10.2 枚举逻辑运算符 217
7.10.3 布尔逻辑运算符 218
7.11 条件逻辑运算符 218
7.11.1 布尔条件逻辑运算符 219
7.11.2 用户自定义的条件逻辑运算符 219
7.12 条件运算符 220
7.13 赋值运算符 221
7.13.1 简单赋值 222
7.13.2 复合赋值 224
7.13.3 事件赋值 226
7.14 表达式 226
7.15 常量表达式 226
7.16 布尔表达式 228
第8章 语句 229
8.1 结束点和可到达性 230
8.2 块 232
语句列表 232
8.3 空语句 233
8.4 标记语句 233
8.5 声明语句 234
8.5.1 局部变量声明 234
8.5.2 局部常量声明 236
8.6 表达式语句 236
8.7 选择语句 237
8.7.1 if语句 237
8.7.2 switch语句 238
8.8 迭代语句 243
8.8.1 while语句 243
8.8.2 do语句 244
8.8.3 for语句 244
8.8.4 foreach语句 246
8.9 跳转语句 248
8.9.1 break语句 250
8.9.2 continue语句 251
8.9.3 goto语句 251
8.9.4 return语句 253
8.9.5 throw语句 254
8.10 try语句 255
8.11 checked语句和unchecked语句 258
8.12 lock语句 259
8.13 using语句 260
第9章 命名空间 263
9.1 编译单元 263
9.2 命名空间声明 264
9.3 using指令 265
9.3.1 using别名指令 266
9.3.2 using命名空间指令 269
9.4 命名空间成员 271
9.5 类型声明 271
第10章 类 273
10.1 类声明 273
10.1.1 类修饰符 273
10.1.2 类基规范 275
10.1.3 类主体 277
10.2 类成员 277
10.2.1 继承 279
10.2.2 new修饰符 280
10.2.3 访问修饰符 280
10.2.4 构成类型 280
10.2.5 静态成员和实例成员 280
10.2.6 嵌套类型 281
10.2.7 保留成员名称 286
10.3 常量 287
10.4 域 290
10.4.1 静态域和实例域 291
10.4.2 只读域 292
10.4.3 易失域 293
10.4.4 域初始化 295
10.4.5 变量初始值设定项 295
10.5 方法 299
10.5.1 方法参数 301
10.5.2 静态方法和实例方法 308
10.5.3 虚方法 308
10.5.4 重写方法 311
10.5.5 密封方法 313
10.5.6 抽象方法 313
10.5.7 外部方法 315
10.5.8 方法主体 316
10.5.9 方法重载 317
10.6 属性 317
10.6.1 静态属性和实例属性 318
10.6.2 访问器 319
10.6.3 虚、密封、重写和抽象访问器 325
10.7 事件 327
10.7.1 类似域的事件 329
10.7.2 事件访问器 331
10.7.3 静态事件和实例事件 332
10.7.4 虚、密封、重写和抽象访问器 333
10.8 索引器 333
索引器重载 338
10.9 运算符 338
10.9.1 一元运算符 340
10.9.2 二元运算符 341
10.9.3 转换运算符 341
10.10 实例构造函数 343
10.10.1 构造函数初始值设定项 344
10.10.2 实例变量初始值设定项 345
10.10.3 构造函数的执行 346
10.10.4 默认构造函数 348
10.10.5 私有构造函数 348
10.10.6 可选的实例构造函数参数 349
10.11 静态构造函数 349
10.12 析构函数 352
第11章 结构 355
11.1 结构声明 355
11.1.1 结构修饰符 356
11.1.2 结构接口 356
11.1.3 结构主体 356
11.2 结构成员 356
11.3 类和结构的区别 357
11.3.1 值语义 357
11.3.2 继承 359
11.3.3 赋值 359
11.3.4 默认值 359
11.3.5 装箱和拆箱 360
11.3.6 this的意义 360
11.3.7 域初始值设定项 361
11.3.8 构造函数 361
11.3.9 析构函数 362
11.3.10 静态构造函数 362
11.4 结构示例 363
11.4.1 数据库整型 363
11.4.2 数据库布尔类型 365
第12章 数组 367
12.1 数组类型 367
System.Array类型 368
12.2 数组创建 369
12.3 数组元素访问 369
12.4 数组成员 369
12.5 数组协变 369
12.6 数组初始值设定项 370
第13章 接口 373
13.1 接口声明 373
13.1.1 接口修饰符 373
13.1.2 基接口 374
13.1.3 接口主体 375
13.2 接口成员 375
13.2.1 接口方法 376
13.2.2 接口属性 377
13.2.3 接口事件 377
13.2.4 接口索引器 377
13.2.5 接口成员访问 378
13.3 完全限定接口成员名 380
13.4 接口实现 380
13.4.1 显式接口成员实现 381
13.4.2 接口映射 384
13.4.3 接口实现继承 387
13.4.4 接口重新实现 389
13.4.5 抽象类和接口 391
第14章 枚举 393
14.1 枚举声明 393
14.2 枚举修饰符 394
14.3 枚举成员 394
14.4 System.Enum类型 397
14.5 枚举的值和运算 397
第15章 委托 399
15.1 委托声明 399
15.2 委托实例化 402
15.3 委托调用 403
第16章 异常 407
16.1 导致异常的原因 407
16.2 System.Exception类 408
16.3 异常的处理方式 408
16.4 公共异常类 409
第17章 特性 411
17.1 特性类 411
17.1.1 特性用法 411
17.1.2 定位和命名参数 413
17.1.3 特性参数类型 414
17.2 特性专用化 414
17.3 特性实例 420
17.3.1 特性的编译 421
17.3.2 特性实例的运行时检索 421
17.4 保留的特性 422
17.4.1 AttributeUsage特性 422
17.4.2 Conditional特性 423
17.4.3 Obsolete特性 427
17.5 交互操作的特性 428
17.5.1 与COM和Win32组件的交互操作 428
17.5.2 与其他.NET语言的交互操作 428
第18章 不安全代码 429
18.1 不安全上下文 429
18.2 指针类型 433
18.3 固定变量和可移动变量 436
18.4 指针转换 437
18.5 表达式中的指针 438
18.5.1 指针间接寻址 439
18.5.2 指针成员访问 439
18.5.3 指针元素访问 440
18.5.4 address-of运算符 441
18.5.5 指针递增和递减 442
18.5.6 指针算法 443
18.5.7 指针比较 444
18.5.8 sizeof运算符 444
18.6 固定语句 446
18.7 堆栈分配 450
18.8 动态内存分配 451
第二篇 C#2.0 455
第19章 C#2.0简介 457
19.1 泛型 458
19.1.1 为什么要使用泛型 458
19.1.2 创建和使用泛型 459
19.1.3 泛型类型实例化 460
19.1.4 约束 460
19.1.5 泛型方法 462
19.2 匿名方法 463
方法组转换 466
19.3 迭代器 467
19.4 分部类型 471
19.5 可空类型 472
第20章 泛型 477
20.1 泛型类声明 477
20.1.1 类型参数 478
20.1.2 实例类型 479
20.1.3 基规范 480
20.1.4 泛型类的成员 480
20.1.5 泛型类中的静态域 481
20.1.6 泛型类中的静态构造函数 482
20.1.7 访问受保护成员 482
20.1.8 泛型类中的重载 483
20.1.9 参数数组方法和类型参数 484
20.1.10 重写与泛型类 484
20.1.11 泛型类中的运算符 485
20.1.12 泛型类中的嵌套类型 487
20.1.13 应用程序入口点 488
20.2 泛型结构声明 488
20.3 泛型接口声明 488
20.3.1 所实现接口的唯一性 488
20.3.2 显式接口成员实现 490
20.4 泛型委托声明 490
20.5 构造类型 491
20.5.1 类型自变量 493
20.5.2 开放和封闭类型 493
20.5.3 构造类型的基类和接口 494
20.5.4 构造类型的成员 494
20.5.5 构造类型的可访问性 495
20.5.6 转换 495
20.5.7 using别名指令 496
20.5.8 属性 497
20.5.9 数组和泛型IList接口 497
20.6 泛型方法 498
20.6.1 泛型方法签名 499
20.6.2 虚泛型方法 500
20.6.3 调用泛型方法 501
20.6.4 类型自变量推断 502
20.6.5 语法多义性 504
20.6.6 通过委托使用泛型方法 505
20.6.7 不能是泛型的成员 506
20.7 约束 506
20.7.1 满足约束 511
20.7.2 类型参数上的成员查找 513
20.7.3 类型参数和装箱 513
20.7.4 涉及类型参数的转换 515
20.8 表达式和语句 517
20.8.1 对象创建表达式 517
20.8.2 typeof运算符 517
20.8.3 引用相等运算符 519
20.8.4 is运算符 520
20.8.5 as运算符 520
20.8.6 异常语句 520
20.8.7 lock语句 520
20.8.8 using语句 521
20.8.9 foreach语句 521
20.9 查找规则的修改 521
20.9.1 命名空间和类型名称 521
20.9.2 成员查找 524
20.9.3 适用函数成员 526
20.9.4 更好的函数成员 526
20.9.5 简单名称 527
20.9.6 成员访问 529
20.9.7 方法调用 531
20.10 右移语法变化 533
第21章 匿名方法 535
21.1 匿名方法表达式 535
21.2 匿名方法签名 535
21.3 匿名方法转换 536
21.4 匿名方法块 537
21.5 外层变量 538
21.5.1 捕获的外层变量 538
21.5.2 局部变量实例化 539
21.6 匿名方法计算 541
21.7 委托实例相等性 542
21.8 明确赋值 543
21.9 方法组转换 544
21.10 委托创建表达式 546
21.11 实现示例 546
第22章 迭代器 551
22.1 迭代器块 551
22.1.1 枚举器接口 551
22.1.2 可枚举接口 552
22.1.3 产生类型 552
22.1.4 this访问 552
22.2 枚举器对象 552
22.2.1 MoveNext方法 553
22.2.2 Current属性 555
22.2.3 Dispose方法 555
22.3 可枚举对象 555
GetEnumerator方法 556
22.4 yield语句 556
明确赋值 558
22.5 实现示例 558
第23章 分部类型 567
23.1 分部声明 567
23.1.1 属性 568
23.1.2 修饰符 568
23.1.3 类型参数和约束 568
23.1.4 基类 569
23.1.5 基接口 569
23.1.6 成员 570
23.2 名称绑定 571
第24章 可空类型 573
24.1 可空类型 573
24.1.1 成员 573
24.1.2 默认值 574
24.1.3 值类型约束 574
24.2 转换 574
24.2.1 null字面值转换 575
24.2.2 可空转换 575
24.2.3 装箱和拆箱转换 576
24.2.4 允许的用户自定义转换 577
24.2.5 用户自定义转换的计算 577
24.2.6 提升的转换 578
24.2.7 用户自定义的隐式转换 578
24.2.8 用户自定义的显式转换 579
24.3 表达式 580
24.3.1 提升运算符 580
24.3.2 允许的用户自定义运算符 581
24.3.3 运算符重载决策 582
24.3.4 相等操作符和空 582
24.3.5 is运算符 582
24.3.6 as运算符 583
24.3.7 复合赋值 583
24.3.8 bool?类型 584
24.3.9 空合并运算符 584
第25章 其他功能 587
25.1 属性访问器的可访问性 587
25.1.1 访问器声明 587
25.1.2 访问器的使用 588
25.1.3 重写和接口实现 589
25.2 静态类 590
25.2.1 静态类声明 590
25.2.2 引用静态类类型 591
25.3 命名空间别名限定符 592
25.3.1 限定的别名成员 594
25.3.2 别名的唯一性 595
25.4 extern别名 596
extern别名指令 598
25.5 pragma指令 600
pragma warning 600
25.6 默认值表达式 601
25.7 条件特性类 602
25.8 固定大小缓冲区 603
25.8.1 固定大小缓冲区的声明 603
25.8.2 表达式中的固定大小缓冲区 605
25.8.3 Fixed语句 606
25.8.4 明确赋值检查 607
第三篇 附录 609
附录A 文档注释 611
附录B 语法 635
索引 675