第一篇 C#1.0 1
第1章 C# 简介 3
1.1 Hello World 3
1.2 程序结构 4
1.3 类型和变量 6
1.4 表达式 8
1.5 语句 9
1.6 类和对象 12
1.6.1 成员 13
1.6.2 可访问性 14
1.6.3 基类 14
1.6.4 字段 15
1.6.5 方法 15
1.6.6 其他函数成员 21
1.7 结构 25
1.8 数组 27
1.9 接口 28
1.10 枚举 29
1.11 委托 31
1.12 特性 32
第2章 词法结构 34
2.1 程序 34
2.2 文法 34
2.2.1 文法表示法 34
2.2.2 词法文法 35
2.2.3 句法文法 35
2.3 词法分析 36
2.3.1 行结束符 36
2.3.2 空白 37
2.3.3注释 37
2.4 标记 38
2.4.1 Unicode字符转义序列 39
2.4.2 标识符 39
2.4.3 关键字 41
2.4.4 文本 42
2.4.5 运算符和标点 47
2.5 预处理指令 47
2.5.1 条件编译符号 48
2.5.2 预处理表达式 49
2.5.3 声明指令 50
2.5.4 条件编译指令 51
2.5.5 诊断指令 53
2.5.6 区域指令 54
2.5.7 行指令 55
第3章 基本概念 56
3.1 应用程序启动 56
3.2 应用程序终止 57
3.3 声明 57
3.4 成员 59
3.4.1 命名空间成员 59
3.4.2 结构成员 60
3.4.3 枚举成员 60
3.4.4 类成员 60
3.4.5 接口成员 60
3.4.6 数组成员 61
3.4.7 委托成员 61
3.5 成员访问 61
3.5.1 已声明可访问性 61
3.5.2 可访问域 62
3.5.3 实例成员的受保护访问 64
3.5.4 可访问性约束 65
3.6 签名和重载 66
3.7 范围 66
3.8 命名空间和类型名称 70
3.9 自动内存管理 72
3.10 执行顺序 75
第4章 类型 76
4.1 值类型 76
4.1.1 System.ValueType 类型 77
4.1.2 默认构造函数 77
4.1.3 结构类型 78
4.1.4 简单类型 78
4.1.5 整型 79
4.1.6 浮点型 80
4.1.7 decimal 类型 81
4.1.8 bool 类型 82
4.1.9 枚举类型 82
4.2 引用类型 82
4.2.1 类类型 83
4.2.2 对象类型 84
4.2.3 string 类型 84
4.2.4 接口类型 84
4.2.5 数组类型 84
4.2.6 委托类型 84
4.3 装箱和取消装箱 85
4.3.1 装箱转换 85
4.3.2 取消装箱转换 86
第5章 变量 87
5.1 变量类别 87
5.1.1 静态变量 87
5.1.2 实例变量 88
5.1.3 数组元素 88
5.1.4 值参数 88
5.1.5 引用参数 88
5.1.6 输出参数 89
5.1.7 局部变量 89
5.2 默认值 90
5.3 明确赋值 90
5.3.1 初始已赋值变量 91
5.3.2 初始未赋值变量 91
5.3.3 确定明确赋值的细则 91
5.4 变量引用 101
5.5 变量引用的原子性 101
第6章 转换 102
6.1 隐式转换 102
6.1.1 标识转换 102
6.1.2 隐式数值转换 102
6.1.3 隐式枚举转换 103
6.1.4 隐式引用转换 103
6.1.5 装箱转换 104
6.1.6 隐式常数表达式转换 104
6.1.7 用户定义的隐式转换 104
6.2 显式转换 104
6.2.1 显式数值转换 105
6.2.2 显式枚举转换 106
6.2.3 显式引用转换 106
6.2.4 取消装箱转换 107
6.2.5 用户定义的显式转换 107
6.3 标准转换 107
6.3.1 标准隐式转换 107
6.3.2 标准显式转换 108
6.4 用户定义的转换 108
6.4.1 允许的用户定义转换 108
6.4.2 用户定义的转换的计算 108
6.4.3 用户定义的隐式转换 109
6.4.4 用户定义的显式转换 110
第7章 表达式 112
7.1 表达式的分类 112
7.2 运算符 113
7.2.1 运算符的优先级和顺序关联性 113
7.2.2 运算符重载 114
7.2.3 一元运算符重载决策 115
7.2.4 二元运算符重载决策 116
7.2.5 候选用户定义运算符 116
7.2.6 数值提升 116
7.3 成员查找 118
7.4 函数成员 119
7.4.1 参数列表 120
7.4.2 重载决策 123
7.4.3 函数成员调用 125
7.5 基本表达式 126
7.5.1 文本 127
7.5.2 简单名称 127
7.5.3 带括号的表达式 128
7.5.4 成员访问 129
7.5.5 调用表达式 131
7.5.6 元素访问 132
7.5.7 This 访问 134
7.5.8 Base 访问 134
7.5.9 后缀增量和后缀减量运算符 135
7.5.10 new 运算符 136
7.5.11 typeof 运算符 140
7.5.12 checked 和 unchecked 运算符 141
7.6 一元运算符 143
7.6.1 一元加运算符 143
7.6.2 一元减运算符 144
7.6.3 逻辑否定运算符 144
7.6.4 按位求补运算符 145
7.6.5 前缀增量和减量运算符 145
7.6.6 强制转换表达式 146
7.7 算术运算符 146
7.7.1 乘法运算符 147
7.7.2 除法运算符 148
7.7.3 余数运算符 149
7.7.4 加法运算符 150
7.7.5 减法运算符 152
7.8 移位运算符 153
7.9 关系和类型测试运算符 155
7.9.1 整数比较运算符 155
7.9.2 浮点比较运算符 156
7.9.3 小数比较运算符 157
7.9.4 布尔相等运算符 157
7.9.5 枚举比较运算符 157
7.9.6 引用类型相等运算符 158
7.9.7 字符串相等运算符 159
7.9.8 委托相等运算符 159
7.9.9 is 运算符 160
7.9.10 as 运算符 160
7.10 逻辑运算符 161
7.10.1 整数逻辑运算符 161
7.10.2 枚举逻辑运算符 162
7.10.3 布尔逻辑运算符 162
7.11 条件逻辑运算符 162
7.11.1 布尔条件逻辑运算符 163
7.11.2 用户定义的条件逻辑运算符 163
7.12 条件运算符 164
7.13 赋值运算符 165
7.13.1 简单赋值 165
7.13.2 复合赋值 167
7.13.3 事件赋值 168
7.14 表达式 168
7.15 常数表达式 168
7.16 布尔表达式 169
第8章 语句 170
8.1 结束点和可到达性 170
8.2 块 172
8.3 空语句 173
8.4 标记语句 173
8.5 声明语句 174
8.5.1 局部变量声明 174
8.5.2 局部常数声明 175
8.6 表达式语句 175
8.7 选择语句 176
8.7.1 if 语句 176
8.7.2 switch 语句 177
8.8 迭代语句 181
8.8.1 while 语句 181
8.8.2 do 语句 181
8.8.3 for 语句 182
8.8.4 foreach 语句 183
8.9 跳转语句 185
8.9.1 break 语句 186
8.9.2 continue 语句 187
8.9.3 goto 语句 187
8.9.4 return 语句 188
8.9.5 throw 语句 189
8.10 try 语句 190
8.11 checked 语句和 unchecked 语句 193
8.12 lock 语句 193
8.13 using 语句 194
第9章 命名空间 197
9.1 编译单元 197
9.2 命名空间声明 197
9.3 using 指令 199
9.3.1 using 别名指令 199
9.3.2 using 命名空间指令 201
9.4 命名空间成员 203
9.5 类型声明 204
第10章 类 205
10.1 类声明 205
10.1.1 类修饰符 205
10.1.2 类基规范 207
10.1.3 类体 208
10.2 类成员 208
10.2.1 继承 209
10.2.2 new 修饰符 210
10.2.3 访问修饰符 210
10.2.4 构成类型 210
10.2.5 静态成员和实例成员 211
10.2.6 嵌套类型 212
10.2.7 保留成员名称 215
10.3 常数 217
10.4 字段 218
10.4.1 静态字段和实例字段 220
10.4.2 只读字段 220
10.4.3 易失字段 221
10.4.4 字段初始化 223
10.4.5 变量初始值设定项 223
10.5 方法 226
10.5.1 方法参数 227
10.5.2 静态方法和实例方法 233
10.5.3 虚拟方法 233
10.5.4 重写方法 235
10.5.5 密封方法 237
10.5.6 抽象方法 237
10.5.7 外部方法 239
10.5.8 方法体 239
10.5.9 方法重载 240
10.6 属性 240
10.6.1 静态属性和实例属性 241
10.6.2 访问器 241
10.6.3 虚拟、密封、重写和抽象访问器 246
10.7 事件 247
10.7.1 类似字段的事件 249
10.7.2 事件访问器 250
10.7.3 静态事件和实例事件 252
10.7.4 虚拟、密封、重写和抽象访问器 252
10.8 索引器 252
10.9 运算符 256
10.9.1 一元运算符 257
10.9.2 二元运算符 258
10.9.3 转换运算符 259
10.10 实例构造函数 260
10.10.1 构造函数初始值设定项 261
10.10.2 实例变量初始值设定项 262
10.10.3 构造函数执行 262
10.10.4 默认构造函数 264
10.10.5 私有构造函数 264
10.10.6 可选的实例构造函数参数 265
10.11 静态构造函数 265
10.12 析构函数 267
第11章 结构 270
11.1 结构声明 270
11.1.1 结构修饰符 270
11.1.2 结构接口 271
11.1.3 结构体 271
11.2 结构成员 271
11.3 类和结构的区别 272
11.3.1 值语义 272
11.3.2 继承 273
11.3.3 赋值 273
11.3.4 默认值 273
11.3.5 装箱和取消装箱 274
11.3.6 this 的意义 274
11.3.7 字段初始值设定项 274
11.3.8 构造函数 275
11.3.9 析构函数 276
11.4 结构示例 276
11.4.1 数据库整数类型 276
11.4.2 数据库布尔类型 277
第12章 数组 280
12.1 数组类型 280
12.2 数组创建 281
12.3 数组元素访问 281
12.4 数组成员 281
12.5 数组协方差 281
12.6 数组初始值设定项 282
第13章 接口 284
13.1 接口声明 284
13.1.1 接口修饰符 284
13.1.2 基接口 285
13.1.3 接口体 285
13.2 接口成员 285
13.2.1 接口方法 286
13.2.2 接口属性 287
13.2.3 接口事件 287
13.2.4 接口索引器 287
13.2.5 接口成员访问 288
13.3 完全限定接口成员名 289
13.4 接口实现 290
13.4.1 显式接口成员实现 291
13.4.2 接口映射 293
13.4.3 接口实现继承 295
13.4.4 接口重新实现 297
13.4.5 抽象类和接口 298
第14章 枚举 299
14.1 枚举声明 299
14.2 枚举修饰符 300
14.3 枚举成员 300
14.4 System.Enum 类型 302
14.5 枚举值和运算 302
第15章 委托 303
15.1 委托声明 303
15.2 委托实例化 305
15.3 委托调用 306
第16章 异常 308
16.1 导致异常的原因 308
16.2 System.Exception 类 308
16.3 异常的处理方式 309
16.4 公共异常类 309
第17章 特性 311
17.1 特性类 311
17.1.1 特性用法 311
17.1.2 定位和命名参数 312
17.1.3 特性参数类型 313
17.2 特性专用化 314
17.3 特性实例 318
17.3.1 特性的编译 319
17.3.2 特性实例的运行时检索 319
17.4 保留特性 319
17.4.1 AttributeUsage 特性 320
17.4.2 Conditional 特性 320
17.4.3 Obsolete 特性 323
17.5 互操作的特性 324
17.5.1 与 COM 和 Win32 组件的互操作 324
17.5.2 与其他 .NET 语言的交互操作 324
第18章 不安全代码 325
18.1 不安全上下文 325
18.2 指针类型 328
18.3 固定变量和可移动变量 330
18.4 指针转换 331
18.5 表达式中的指针 332
18.5.1 指针间接寻址 332
18.5.2 指针成员访问 333
18.5.3 指针元素访问 334
18.5.4 address-of 运算符 335
18.5.5 指针增加和指针减小 335
18.5.6 指针算法 336
18.5.7 指针比较 337
18.5.8 sizeof 运算符 337
18.6 固定语句 338
18.7 堆栈分配 341
18.8 动态内存分配 342
第二篇 C#2.0 243
第19章 C# 2.0介绍 347
19.1 泛型 347
19.1.1 为什么使用泛型 347
19.1.2 创建和使用泛型 348
19.1.3 泛型类型实例化 349
19.1.4约束 350
19.1.5泛型方法 351
19.2 匿名方法 352
19.3 迭代器 354
19.4 不完整类型 358
第20章 泛型 360
20.1 泛型类声明 360
20.1.1 类型参数 360
20.1.2 实例类型 362
20.1.3 基类规范 362
20.1.4 泛型类的成员 363
20.1.5 泛型类中的静态字段 363
20.1.6 泛型类中的静态构造函数 364
20.1.7 访问受保护的成员 364
20.1.8 在泛型类中重载 365
20.1.9 参数数组方法和类型参数 366
20.1.10 重写和泛型类 366
20.1.11 泛型类中的运算符 367
20.1.12 泛型类中的嵌套类型 368
20.1.13 应用程序入口点 369
20.2 泛型结构声明 369
20.3 泛型接口声明 369
20.3.1 实现接口的惟一性 370
20.3.2 显式接口成员实现 370
20.4 泛型委托声明 371
20.5 构造类型 371
20.5.1 类型实参 373
20.5.2 开放类型和封闭类型 373
20.5.3 构造类型的基类和接口 373
20.5.4 构造类型的成员 374
20.5.5 构造类型的可访问性 375
20.5.6 转换 375
20.5.7 System.Nullable<T>类型 376
20.5.8 使用别名指令 376
20.5.9 特性 376
20.6 泛型方法 377
20.6.1 泛型方法签名 378
20.6.2 虚拟泛型方法 379
20.6.3 调用泛型方法 379
20.6.4 类型实参推断 379
20.6.5 语法歧义 381
20.6.6 对委托使用泛型方法 381
20.6.7 非泛型属性、事件、索引器或运算符 382
20.7 约束 382
20.7.1 满足约束 384
20.7.2 类型参数上的成员查找 385
20.7.3 类型参数和装箱 385
20.7.4 包含类型参数的转换 387
20.8 表达式和语句 388
20.8.1 默认值表达式 388
20.8.2 对象创建表达式 389
20.8.3 type of 运算符 389
20.8.4 引用相等运算符 390
20.8.5 is运算符 390
20.8.6 as运算符 390
20.8.7 异常语句 391
20.8.8 lock语句 391
20.8.9 using 语句 391
20.8.10 foreach语句 391
20.9 查找规则修订 392
20.9.1 命名空间和类型名称 392
20.9.2 成员查找 393
20.9.3 简单名称 395
20.9.4 成员访问 396
20.9.5 方法调用 397
20.9.6委托创建表达式 399
20.10 右移语法改变 399
第21章 匿名方法 401
21.1 匿名方法表达式 401
21.2 匿名方法签名 401
21.3 匿名方法转换 402
21.4 匿名方法块 403
21.5 外部变量 404
21.5.1 捕获外部变量 404
21.5.2 局部变量实例化 405
21.6 匿名方法求值 407
21.7 委托实例相等性 407
21.8 明确赋值 408
21.9 方法组转换 408
21.10 实现示例 409
第22章 迭代器 412
22.1 迭代器块 412
22.1.1 枚举器接口 412
22.1.2 可枚举接口 412
22.1.3 yield 类型 412
22.1.4 this 访问 413
22.2 枚举对象 413
22.2.1 MoveNext方法 414
22.2.2 Current属性 415
22.2.3 Dispose方法 415
22.3 可枚举对象 415
22.4 yield 语句 416
22.5 实现示例 418
第23章 不完整类型 422
23.1 不完整类型声明 422
23.1 特性 423
23.1.2 修饰符 423
23.1.3 类型参数和约束 423
23.1.4 基类 424
23.1.5 基接口 424
23.1.6 成员 425
23.2 名称绑定 425
附录A 文档注释 427
附录B 语法 445