第1章 C#简介 1
1.1 C#的名称 1
1.2 C#概述 1
1.2.1 C#的历史 2
1.2.2 C#与公共语言运行库 2
1.2.3 迁移到.NET 2
1.2.4 相关标准 3
1.2.5 其他实现 3
1.3 C#代码的简单示例 3
1.4 学习C#的益处 5
1.5 小结 6
第2章 开始使用C# 7
2.1 开始使用C#,比想象中廉价 7
2.1.1 低端的工具 7
2.1.2 如何使用免费的C#工具 9
2.2 一个让工作更轻松的廉价工具 12
2.3 其他可选的文本编辑器和C#工具 14
2.4 企业级工具——Visual Studio与Visual C# 14
2.5 小结 15
第3章 C#语言概述 17
3.1 C# 17
3.2 C#基础 17
3.3 类型 18
3.3.1 值类型 19
3.3.2 引用类型 19
3.3.3 预定义类型 19
3.3.4 重载 21
3.3.5 类型转换 22
3.3.6 数组类型 22
3.4 变量和参数 22
3.5 表达式 24
3.6 语句 25
3.7 类 26
3.7.1 常量 27
3.7.2 字段 27
3.7.3 方法 27
3.7.4 属性 27
3.7.5 事件 27
3.7.6 运算符 28
3.7.7 索引器 28
3.7.8 实例构造函数 28
3.7.9 终结器 28
3.7.10 静态构造函数 28
3.7.11 继承 28
3.7.12 静态类 29
3.8 结构 29
3.9 接口 29
3.10 委托 29
3.11 枚举 30
3.12 泛型 30
3.13 迭代器 30
3.14 可空类型 30
3.15 小结 31
第4章 C#语言结构 33
4.1 C#程序 33
4.2 文法 34
4.2.1 文法的二义性 35
4.2.2 词法分析 36
4.3 小结 52
第5章 C#基本概念 53
5.1 应用程序启动 53
5.2 应用程序终止 54
5.3 C#中的声明 54
5.4 成员 56
5.4.1 命名空间成员 56
5.4.2 结构的成员 56
5.4.3 枚举成员 56
5.4.4 类成员 56
5.4.5 接口成员 57
5.4.6 数组成员 57
5.4.7 委托成员 57
5.5 成员访问 57
5.6 签名 58
5.6.1 索引器签名 58
5.6.2 实例构造函数签名 58
5.6.3 方法签名 59
5.6.4 运算符签名 59
5.6.5 签名和重载 59
5.7 作用域 60
5.8 命名空间和类型名称 61
5.9 C#中的内存管理 61
5.10 小结 61
第6章 类型 63
6.1 C#中的3种类型 63
6.2 C#的类型系统 64
6.3 值类型 64
6.3.1 System.ValueType类型 65
6.3.2 默认构造函数 65
6.3.3 结构类型 66
6.3.4 简单类型 66
6.3.5 整型 67
6.3.6 使用类型 68
6.3.7 浮点类型 69
6.3.8 decimal类型 69
6.3.9 布尔类型 70
6.3.10 枚举类型 70
6.4 引用类型 70
6.4.1 类类型 71
6.4.2 object类型 71
6.4.3 string类型 72
6.4.4 数组类型 72
6.4.5 委托类型 72
6.4.6 null类型 72
6.4.7 装箱和拆箱 72
6.4.8 可空类型 73
6.5 小结 73
第7章 变量 75
7.1 变量是什么? 75
7.2 变量的类别 76
7.2.1 静态变量 77
7.2.2 数组元素 77
7.2.3 实例变量 78
7.2.4 值参数 78
7.2.5 引用参数 79
7.2.6 输出参数 79
7.2.7 局部变量 80
7.3 默认值 81
7.4 明确赋值 81
7.4.1 初始已赋值变量 81
7.4.2 初始未赋值变量 82
7.5 小结 90
第8章 转换 91
8.1 隐式转换 91
8.1.1 同一性转换 92
8.1.2 隐式数值转换 92
8.1.3 隐式枚举转换 92
8.1.4 隐式引用转换 93
8.1.5 装箱转换 93
8.1.6 隐式类型参数转换 94
8.1.7 隐式常数表达式转换 94
8.1.8 用户自定义的隐式转换 94
8.2 显式转换 95
8.2.1 显式数值转换 95
8.2.2 显式枚举转换 97
8.2.3 显式引用转换 97
8.2.4 拆箱转换 98
8.2.5 显式类型参数转换 98
8.2.6 用户自定义的显式转换 98
8.3 标准转换 98
8.3.1 标准隐式转换 99
8.3.2 标准显式转换 99
8.3.3 用户定义的转换 99
8.4 用户定义的隐式转换 99
8.5 匿名方法转换 100
8.6 方法组转换 100
8.7 Null类型转换 100
8.8 小结 101
第9章 表达式 103
9.1 表达式的分类 103
9.2 表达式的值 104
9.3 表达式与运算符 104
9.3.1 三类运算符 104
9.3.2 运算符的优先级和结合性 105
9.3.3 运算符重载 107
9.3.4 运算符提升 109
9.4 成员查找 110
9.5 函数成员 112
9.6 基本表达式 115
9.6.1 字面值 115
9.6.2 简单名称 116
9.6.3 带括号的表达式 116
9.6.4 成员访问 116
9.6.5 调用表达式 117
9.6.6 元素访问 117
9.6.7 默认值表达式 120
9.6.8 匿名方法 121
9.7 一元表达式 121
9.8 强制转换表达式 121
9.9 算术运算符 121
9.10 移位运算符 122
9.11 关系和类型测试运算符 122
9.12 逻辑运算符 123
9.13 条件逻辑运算符 124
9.14 空值结合运算符 125
9.15 赋值运算符 125
9.16 表达式 126
9.17 常量表达式 126
9.18 布尔表达式 127
9.19 小结 128
第10章 语句 129
10.1 什么是语句? 129
10.2 C#语句 130
10.2.1 结束点和可到达性 131
10.2.2 结束点 132
10.2.3 可到达性 132
10.3 代码块 134
10.4 空语句 135
10.5 标记语句 135
10.6 声明语句 136
10.6.1 局部变量声明 136
10.6.2 局部常量声明 137
10.7 表达式语句 137
10.7.1 选择语句 138
10.7.2 迭代语句 143
10.7.3 跳转语句 146
10.7.4 using语句 148
10.7.5 yield语句 149
10.8 小结 150
第11章 命名空间 151
11.1 什么是命名空间? 151
11.1.1 使用命名空间组织类 151
11.1.2 控制范围 152
11.2 编译单元 152
11.3 命名空间声明 153
11.4 Extern别名指令 154
11.5 Using指令 155
11.5.1 命名空间成员 155
11.5.2 类型声明 156
11.5.3 限定的别名成员 157
11.6 小结 158
第12章 类 159
12.1 类是什么? 159
12.2 类的声明 159
12.2.1 类修饰符 160
12.2.2 基类规范 161
12.2.3 基类 161
12.2.4 实现接口 161
12.2.5 类体 161
12.2.6 Partial声明 161
12.3 类成员 162
12.3.1 继承 163
12.3.2 new修饰符 163
12.3.3 访问修饰符 163
12.3.4 静态成员与实例成员 164
12.3.5 常量 164
12.4 字段 165
12.4.1 静态字段与实例字段 166
12.4.2 只读字段 166
12.5 方法 167
12.5.1 方法的参数 168
12.5.2 静态方法和实例方法 169
12.5.3 虚方法 169
12.5.4 重写方法 169
12.5.5 密封方法 170
12.5.6 抽象方法 170
12.5.7 方法体 170
12.6 属性 170
12.6.1 静态属性和实例属性 171
12.6.2 属性访问器 171
12.6.3 虚访问器、密封、重写和抽象访问器 172
12.7 事件 173
12.7.1 类似字段的事件(Field-Like Events) 174
12.7.2 静态和实例事件 174
12.7.3 虚事件访问器、密封、重写和抽象事件访问器 174
12.8 索引器(Indexers) 175
12.9 运算符 176
12.9.1 一元运算符 178
12.9.2 二元运算符 178
12.9.3 转换运算符 178
12.10 实例构造函数 178
12.11 静态构造函数 179
12.12 终结器 180
12.13 小结 180
第13章 结构 181
13.1 结构是什么? 181
13.2 结构的声明 182
13.2.1 结构修饰符 182
13.2.2 结构的接口 183
13.2.3 结构体 183
13.2.4 结构成员 183
13.3 结构与类的差别 184
13.3.1 值语义(Value Semantics) 184
13.3.2 继承 185
13.3.3 赋值 185
13.3.4 默认值 186
13.3.5 装箱和拆箱 186
13.3.6 this 186
13.3.7 字段初始值设定项 186
13.3.8 构造函数 186
13.3.9 终结器 187
13.3.10 静态构造函数 187
13.4 何时使用结构 187
13.5 小结 188
第14章 数组 189
14.1 什么是数组? 189
14.2 数组类型 190
14.3 创建数组 192
14.3.1 访问数组元素 192
14.3.2 数组成员 192
14.3.3 数组的协变 193
14.3.4 数组初始值设定项 193
14.4 小结 196
第15章 接口 197
15.1 接口是什么? 197
15.2 定义接口 197
15.3 接口声明 198
15.3.1 接口的修饰符 199
15.3.2 直接基接口 199
15.3.3 接口体 199
15.3.4 接口成员 199
15.3.5 接口方法 200
15.3.6 接口属性 200
15.3.7 接口事件 201
15.4 小结 201
第16章 枚举 203
16.1 枚举声明 204
16.2 枚举修饰符 205
16.3 枚举成员 206
16.4 避免循环引用 207
16.5 System.Enum 207
16.6 小结 208
第17章 委托 209
17.1 使用委托 209
17.2 委托的声明 210
17.2.1 修饰符 210
17.2.2 声明委托 211
17.2.3 调用链 211
17.2.4 委托的实例化 212
17.3 小结 213
第18章 异常 215
18.1 产生异常的原因 215
18.2 System.Exception类 215
18.3 常见的异常类 216
18.4 异常处理 216
18.5 小结 217
第19章 特性 219
19.1 特性的介绍 219
19.2 特性类 219
19.2.1 位置参数与命名参数 220
19.2.2 特性的用法 220
19.2.3 特性的参数类型 221
19.3 特性申明 221
19.4 特性实例 224
19.4.1 特性的编译 224
19.4.2 在运行时检索特性的实例 225
19.5 保留的特性 225
19.6 小结 228
第20章 泛型 229
20.1 C#泛型与C++模板 229
20.2 泛型类的声明 230
20.2.1 类型参数 231
20.2.2 类型参数的特点 231
20.2.3 实例类型 232
20.2.4 泛型类的成员 233
20.2.5 泛型类中的静态字段 233
20.2.6 泛型类中的静态构造函数 234
20.2.7 访问Protected成员 234
20.2.8 泛型类的重载 234
20.2.9 泛型类中的运算符 234
20.3 泛型结构声明 235
20.4 泛型接口声明 235
20.5 显式接口成员实现 236
20.6 泛型委托声明 236
20.7 构造类型 236
20.7.1 类型实参 237
20.7.2 开放类型和封闭类型 237
20.7.3 构造类型的成员 237
20.7.4 using别名指令 238
20.7.5 泛型方法 238
20.8 不能作为泛型的实体 240
20.9 约束 240
20.10 小结 243
第21章 迭代器 245
21.1 迭代器块 246
21.1.1 迭代器块和编译时错误 247
21.1.2 枚举器接口(Enumerator Interfaces) 247
21.1.3 可枚举接口(Enumerable Interfaces) 247
21.1.4 产生类型(Yield Type) 248
21.1.5 this 248
21.2 枚举器对象 248
21.2.1 MoveNext方法 248
21.2.2 中断执行 249
21.2.3 Current属性 250
21.2.4 Dispose方法 250
21.3 可枚举对象 251
21.4 小结 252
第22章 非安全代码 253
22.1 什么是非安全代码? 253
22.2 非安全代码的利与弊 253
22.2.1 使用非安全代码的好处 254
22.2.2 使用非安全代码的弊端 254
22.3 非安全代码的上下文 254
22.4 指针基础 256
22.4.1 Void指针 256
22.4.2 指针运算符 256
22.5 使用非安全代码 257
22.6 sizeof运算符 260
22.7 使用stackalloc 260
22.8 编译非安全代码 261
22.9 小结 261
附录A C#文法 263
附录B 命名规范 323
附录C 标准库 331
附录D 可移植性 347
附录E XML文档注释 351