第1章 C#基础 1
1.1 C#家族树 2
1.1.1 C语言:现代编程的开端 2
1.1.2 OOP与C++的产生 2
1.1.3 Internet与Java的出现 3
1.1.4 C#的产生 4
1.2 C#的发展 5
1.3 C#与.NET Framework的关系 6
1.3.1 .NET Framework的定义 6
1.3.2 公共语言运行库的工作方式 6
1.3.3 托管与非托管代码 7
1.3.4 公共语言规范 7
1.4 面向对象编程 8
1.4.1 封装 8
1.4.2 多态性 9
1.4.3 继承 9
1.5 创建、编译和运行第一个C#程序 10
1.5.1 获得C#3.0编译器 11
1.5.2 使用Visual Studio IDE 11
1.5.3 使用C#命令行编译器csc.exe 15
1.6 逐行分析第一个样本程序 16
1.7 处理语法错误 18
1.8 程序变体 19
1.9 使用变量 19
1.10 double数据类型 22
1.11 两种控制语句 25
1.11.1 if语句 25
1.11.2 for循环 27
1.12 使用代码块 29
1.13 分号和定位 30
1.14 C#关键字 32
1.15 标识符 33
1.16 C#类库 34
第2章 数据类型与运算符简介 37
2.1 数据类型重要的原因 38
2.2 C#的值类型 38
2.3 浮点类型 41
2.4 decimal类型 42
2.5 字符 43
2.6 bool类型 44
2.7 一些输出选项 45
2.8 字面值 48
2.8.1 十六进制字面值 49
2.8.2 字符转义序列 49
2.8.3 字符串字面值 50
2.9 详细介绍变量 52
2.9.1 初始化变量 52
2.9.2 动态初始化 53
2.9.3 隐式类型变量 53
2.10 变量的作用域和生命周期 55
2.11 运算符 58
2.12 算术运算符 58
2.13 关系与逻辑运算符 61
2.14 赋值运算符 66
2.14.1 复合赋值 66
2.14.2 赋值中的类型转换 67
2.15 强制转换不兼容的类型 68
2.16 运算符优先级 70
2.17 表达式中的类型转换 70
第3章 程序控制语句 77
3.1 从键盘输入字符 78
3.2 if语句 79
3.2.1 嵌套if 80
3.2.2 if-else-if梯次 81
3.3 switch语句 82
3.4 for循环 89
3.4.1 for循环的一些变体 91
3.4.2 在for循环内声明循环控制变量 94
3.5 while循环 95
3.6 do-while循环 96
3.7 使用break退出循环 101
3.8 使用continue 103
3.9 goto 104
3.10 嵌套循环 109
第4章 类、对象及方法 113
4.1 类的基础知识 114
4.1.1 类的一般形式 114
4.1.2 定义类 115
4.2 创建对象的方式 119
4.3 引用变量与赋值 120
4.4 方法 120
4.4.1 向Vehicle类中添加方法 121
4.4.2 从方法返回 123
4.4.3 返回值 124
4.4.4 使用形参 126
4.4.5 向Vehicle中添加一个参数化方法 128
4.5 构造函数 135
4.5.1 参数化构造函数 136
4.5.2 向Vehicle类中添加一个构造函数 137
4.6 再次介绍new运算符 139
4.7 垃圾收集与析构函数 139
4.8 this关键字 140
第5章 更多数据类型与运算符 145
5.1 数组 146
5.2 多维数组 152
5.2.1 二维数组 152
5.2.2 三维或多维数组 153
5.2.3 初始化多维数组 153
5.3 交错数组 154
5.4 数组引用赋值 156
5.5 使用数组的Length属性 157
5.6 创建隐式类型数组 160
5.7 foreach循环 164
5.8 字符串 167
5.8.1 构造string 167
5.8.2 对字符串进行操作 168
5.8.3 字符串的数组 170
5.8.4 字符串是不可变的 171
5.9 按位运算符 172
5.9.1 按位AND、OR、XOR和NOT运算符 173
5.9.2 移位运算符 177
5.9.3 按位复合赋值 179
5.10 “?”运算符 182
第6章 详细介绍方法与类 187
6.1 控制对类成员的访问权限 188
6.2 向方法传递对象引用 194
6.3 使用ref和out形参 197
6.3.1 使用ref 198
6.3.2 使用out 199
6.4 使用可变数量的实参 202
6.5 返回对象 204
6.6 方法重载 206
6.7 重载构造函数 212
6.8 Main()方法 218
6.8.1 从Main()中返回值 218
6.8.2 向Main()传递实参 219
6.9 递归 221
6.10 理解static 222
6.11 static构造函数和类 225
第7章 运算符重载、索引器及属性 231
7.1 运算符重载 232
7.1.1 operator方法的一般形式 232
7.1.2 重载二元运算符 233
7.1.3 重载一元运算符 235
7.1.4 增加灵活性 239
7.1.5 重载关系运算符 244
7.1.6 关于运算符重载的提示与限制 246
7.2 索引器 247
7.2.1 多维索引器 252
7.2.2 索引器限制 254
7.3 属性 254
7.3.1 自动实现属性 258
7.3.2 属性限制 259
7.4 使用带存取器的访问修饰符 259
第8章 继承 271
8.1 继承基础知识 272
8.2 成员访问和继承 275
8.3 使用受保护访问 278
8.4 构造函数与继承 279
8.5 继承与名称隐藏 285
8.6 使用base访问隐藏名称 286
8.7 创建多层层次结构 291
8.8 何时调用构造函数 294
8.9 基类引用和派生对象 295
8.10 虚方法与重写 298
8.10.1 重写方法的原因 301
8.10.2 应用虚方法 301
8.11 使用抽象类 304
8.12 使用sealed关键字防止继承 308
8.13 obiect类 309
第9章 接口、结构与枚举 315
9.1 接口 316
9.2 使用接口引用 320
9.3 接口属性 328
9.4 接口索引器 330
9.5 接口可以继承 332
9.6 显式实现 333
9.7 结构 336
9.8 枚举 338
9.8.1 初始化枚举 340
9.8.2 指定枚举的底层类型 340
第10章 异常处理 343
10.1 System.Exception类 344
10.2 异常处理基础知识 344
10.2.1 使用try和catch 344
10.2.2 一个简单的异常示例 345
10.2.3 第二个异常示例 346
10.3 未捕获异常的后果 347
10.4 异常有助于适当地处理错误 349
10.5 使用多个catch子句 350
10.6 捕获所有异常 351
10.7 try块可以嵌套 352
10.8 抛出异常 353
10.9 使用finally 355
10.10 详述异常 357
10.11 派生异常类 359
10.12 捕获派生类异常 361
10.13 使用checked和unchecked 366
第11章 使用I/O 371
11.1 构建在流基础上的C#I/O 372
11.1.1 字节流与字符流 372
11.1.2 预先定义的流 372
11.2 各种流类 372
11.2.1 Stream类 373
11.2.2 字节流类 374
11.2.3 字符流包装器类 374
11.2.4 二进制流 376
11.3 控制台I/O 376
11.3.1 读取控制台输入 376
11.3.2 编写控制台输出 378
11.4 FileStream和面向字节的文件I/O 379
11.4.1 打开和关闭文件 380
11.4.2 从FileStream中读取字节 382
11.4.3 写人文件 383
11.5 基于字符的文件I/O 385
11.5.1 使用StreamWriter 386
11.5.2 使用StreamReader 388
11.6 重定向标准流 389
11.7 读、写二进制数据 393
11.7.1 BinaryWriter 393
11.7.2 BinaryReader 394
11.7.3 说明二进制I/O 395
11.8 随机访问文件 397
11.9 将数值字符串转换成它们的内部表示 399
第12章 委托、事件与名称空间 411
12.1 委托 412
12.1.1 使用实例方法作为委托 415
12.1.2 多播 416
12.1.3 为什么使用委托 418
12.2 匿名方法 419
12.3 事件 422
12.3.1 多播事件示例 424
12.3.2 通过事件使用匿名方法 426
12.4 名称空间 428
12.4.1 声明名称空间 428
12.4.2 using 431
12.4.3 using的第二种形式 432
12.4.4 名称空间可以累加 433
12.4.5 名称空间可以嵌套 434
12.4.6 全局名称空间 436
第13章 泛型 441
13.1 泛型的概念 442
13.2 泛型的基本原理 442
13.2.1 基于类型实参的不同泛型类型 445
13.2.2 泛型提高类型安全性 445
13.3 包含两个类型形参的泛型类 448
13.4 约束类型 450
13.4.1 使用基类约束 451
13.4.2 使用约束在两个类型形参之间建立关系 453
13.4.3 使用接口约束 454
13.4.4 使用new()构造函数约束 456
13.4.5 引用类型约束和值类型约束 458
13.4.6 使用多种约束 460
13.5 创建类型形参的默认值 461
13.6 泛型结构 463
13.7 泛型方法 464
13.7.1 使用显式类型实参调用泛型方法 467
13.7.2 在泛型方法中使用约束 467
13.8 泛型委托 468
13.9 泛型接口 470
第14章 LINQ简介 481
14.1 LINQ的定义 482
14.2 LINQ的基本原理 483
14.2.1 简单查询 483
14.2.2 查询可以多次执行 485
14.2.3 查询中的数据类型如何关联 486
14.2.4 查询的一般形式 487
14.3 使用where过滤值 488
14.4 使用orderby给结果排序 490
14.5 仔细分析select 491
14.6 使用group分组结果 494
14.7 使用into创建继续 496
14.8 使用let在查询中创建变量 498
14.9 使用join连接两个序列 499
14.10 匿名类型和对象初始化器 502
14.11 创建分组连接 505
14.12 查询方法和拉姆达表达式 508
14.12.1 基本查询方法 508
14.12.2 拉姆达表达式 509
14.12.3 使用查询方法创建查询 510
14.12.4 更多与查询相关的扩展方法 512
14.i2.5 延迟查询执行和即时查询执行 515
14.13 进一步研究扩展方法 516
14.14 进一步研究拉姆达表达式 518
14.14.1 表达式拉姆达 518
14.14.2 语句拉姆达 520
第15章 预处理程序、RTTI、可空类型和其他高级主题 525
15.1 预处理程序 526
15.1.1 #define 526
15.1.2 #if和#endif 526
15.1.3 #else和#elif 528
15.1.4 #undef 530
15.1.5 #error 531
15.1.6 #warning 531
15.1.7 #line 531
15.1.8 #region和#endregion 531
15.1.9 #pragma 532
15.2 运行时类型标识 532
15.2.1 使用is测试类型 532
15.2.2 使用as 533
15.2.3 使用typeof 534
15.3 可空类型 534
15.3.1 “??”运算符 536
15.3.2 可空对象与关系和逻辑运算符 537
15.4 不安全代码 538
15.4.1 指针简介 538
15.4.2 不安全的关键字 540
15.4.3 使用fixed 541
15.5 属性 542
15.5.1 Conditional属性 543
15.5.2 Obsolete属性 544
15.6 转换运算符 545
15.7 集合简介 548
15.7.1 集合的基础知识 549
15.7.2 集合示例研究:创建一个动态数组 550
15.8 其他关键字 555
15.8.1 internal访问修饰符 555
15.8.2 sizeof 556
15.8.3 lock 556
15.8.4 readonly 556
15.8.5 stackalloc 557
15.8.6 using语句 557
15.8.7 const和volatile 558
15.8.8 partial修饰符 558
15.8.9 yield 561
15.8.10 extern 561
15.9 展望 561
附录A 自测题答案 563