第Ⅰ部分C#语言 3
第1章C#的起源 3
1.1 C#的族谱 3
1.1.1 C语言:现代程序设计的开端 3
1.1.2 OOP和C++++语言的创建 4
1.1.3 Intemet和Java的出现 4
1.1.4 C#的创建 5
1.1.5 C#的发展 6
1.2 C#如何与.NET Framework相关 7
1.3公共语言运行库的工作原理 7
1.4托管和非托管代码 8
第2章C#概述 9
2.1面向对象程序设计 9
2.1.1封装 10
2.1.2多态性 10
2.1.3继承 11
2.2简单示例一 11
2.2.1 C#命令行编译器csc.exe 12
2.2.2使用Visual Studio IDE 13
2.2.3逐行分析第一个示例程序 17
2.3处理语法错误 18
2.4改写示例一 19
2.5简单示例二 20
2.6另一种数据类型 21
2.7两种控制语句 23
2.7.1 if语句 23
2.7.2 for循环 25
2.8代码块 26
2.9分号、定位和缩进 28
2.10 C#语言的关键字 28
2.11标识符 29
2.12.NET Framework类库 30
第3章 数据类型、直接量和变量 31
3.1数据类型的重要性 31
3.2 C#的数据类型 31
3.3整数类型 32
3.4浮点类型 34
3.5 decimal类型 36
3.6字符类型 37
3.7布尔类型 38
3.8自定义输出格式 39
3.9直接量 42
3.9.1十六进制直接量 42
3.9.2字符转义序列 43
3.9.3字符串直接量 43
3.10变量 45
3.10.1初始化变量 45
3.10.2动态初始化变量 46
3.10.3隐式类型的变量 46
3.11变量的作用域和生命周期 48
3.12类型转换 50
3.12.1自动类型转换 50
3.12.2强制转换不兼容的类型 51
3.13表达式中的类型转换 54
第4章 运算符 59
4.1算术运算符 59
4.2关系和逻辑运算符 63
4.3赋值运算符 67
4.4按位运算符 68
4.4.1按位与、或、异或和取反运算符 69
4.4.2移位运算符 75
4.4.3按位复合赋值 77
4.5问号(?)运算符 78
4.6空白符和圆括号 79
4.7运算符优先级 79
第5章 程序控制语句 81
5.1 if语句 81
5.1.1 if语句嵌套 82
5.1.2 if-else-if阶梯结构 83
5.2 switch语句 84
5.3 for循环 88
5.4 while循环 96
5.5 do-while循环 97
5.6 foreach循环 98
5.7使用break语句退出循环 98
5.8使用continue语句 101
5.9 goto语句 102
第6章 类和对象 105
6.1类基础 105
6.1.1类的基本形式 105
6.1.2定义类 106
6.2如何创建对象 110
6.3引用类型的变量和赋值 111
6.4方法 111
6.4.1给Building类添加方法 112
6.4.2从方法返回 114
6.4.3返回值 115
6.4.4使用参数 117
6.4.5给Building类添加带参数的方法 119
6.4.6避免产生不可到达的代码 121
6.5构造函数 121
6.5.1带参数的构造函数 122
6.5.2给Building类添加构造函数 123
6.6 new运算符 124
6.7垃圾回收和析构函数 125
6.8 this关键字 127
第7章 数组和字符串 131
7.1数组 131
7.2多维数组 135
7.2.1二维数组 135
7.2.2三维或更多维的数组 136
7.2.3初始化多维数组 137
7.3交错数组 138
7.4数组引用赋值 141
7.5 Length属性 142
7.6隐式类型的数组 145
7.7 foreach循环 147
7.8字符串 150
7.8.1构造字符串 151
7.8.2操作字符串 151
7.8.3字符串数组 154
7.8.4字符串是不可变的 156
7.8.5在switch语句中使用字符串 157
第8章 方法和类 159
8.1控制对类成员的访问 159
8.1.1 C#的访问修饰符 159
8.1.2公有访问和私有访问的应用 161
8.1.3访问控制:案例分析 161
8.2给方法传递引用 166
8.3使用ref和out参数 170
8.3.1使用ref关键字 170
8.3.2使用out关键字 172
8.3.3对引用参数使用ref和out 174
8.4使用数量可变的参数 176
8.5返回对象 178
8.6方法重载 182
8.7构造函数重载 187
8.8对象初始化器 193
8.9 Main()方法 194
8.9.1从Main()返回值 194
8.9.2给Main()传递参数 194
8.10递归 196
8.11理解static关键字 199
8.12静态类 204
第9章 运算符重载 207
9.1运算符重载基础 207
9.1.1重载二元运算符 208
9.1.2重载一元运算符 210
9.2处理针对C#内置类型的运算 214
9.3重载关系运算符 219
9.4重载true和false 221
9.5重载逻辑运算符 223
9.5.1一种重载逻辑运算符的简单方法 223
9.5.2使用短路运算符 226
9.6转换运算符 230
9.7运算符重载的注意事项 234
9.8运算符重载的另一个示例 235
第10章 索引器和属性 239
10.1索引器 239
10.1.1创建一维索引器 239
10.1.2索引器重载 243
10.1.3索引器不需要一个潜在的数组 245
10.1.4多维索引器 246
10.2属性 249
10.2.1自动实现属性 254
10.2.2对属性使用对象初始化器 254
10.2.3属性限制 255
10.3对存取器使用访问修饰符 255
10.4使用索引器和属性 258
第11章 继承 265
11.1继承基础 265
11.2成员访问和继承 268
11.3构造函数和继承 272
11.4继承和名称隐藏 279
11.5创建多级层次结构 282
11.6构造函数的调用 285
11.7基类引用和派生对象 286
11.8虚方法和重写 290
11.8.1重写方法的原因 294
11.8.2应用虚方法 294
11.9使用抽象类 298
11.10使用sealed来阻止继承 302
11.11 object类 302
11.11.1装箱和拆箱 304
11.11.2 object是否是通用数据类型 306
第12章 接口、结构和枚举 309
12.1接口 309
12.2使用接口类型的引用 314
12.3接口属性 317
12.4接口索引器 318
12.5接口的继承 320
12.6接口继承引起的名称隐藏 321
12.7显式实现 321
12.8在接口和抽象类之间选择 324
12.9.NET标准接口 324
12.10结构 325
12.11枚举 330
12.11.1初始化一个枚举 332
12.11.2指定枚举的基本类型 332
12.11.3使用枚举 332
第13章 异常处理 335
13.1 System.Exception类 335
13.2异常处理的基础 335
13.2.1使用try和catch 336
13.2.2一个简单的异常示例 336
13.2.3另一个异常示例 338
13.3未捕获异常的后果 339
13.4使用多个catch子句 341
13.5捕获所有的异常 342
13.6嵌套try块 344
13.7抛出异常 345
13.8 finally语句 347
13.9进一步分析异常类 349
13.10派生异常类 352
13.11捕获派生类异常 356
13.12 checked语句和unchecked语句 357
第14章I/O系统 361
14.1 C#的I/O依赖于数据流 361
14.1.1字节数据流和字符数据流 361
14.1.2预定义数据流 361
14.1.3数据流类 362
14.1.4 Stream类 362
14.1.5字节数据流类 363
14.1.6字符数据流封装类 363
14.1.7二进制数据流 365
14.2控制台I/O 365
14.2.1读取控制台输入 365
14.2.2使用ReadKey()方法 367
14.2.3写入控制台输出 369
14.3文件数据流和面向字节的文件I/O操作 370
14.3.1打开和关闭文件 370
14.3.2从FileStream中读取字节 372
14.3.3写入文件 373
14.3.4使用FileStream复制文件 374
14.4基于字符的文件I/O操作 376
14.4.1使用StreamWriter类 376
14.4.2 StreamReader类 378
14.5重定向标准数据流 380
14.6读取和写入二进制数据 382
14.6.1 BinaryWriter 382
14.6.2 BinaryReader 382
14.6.3二进制I/O操作的程序示例 384
14.7随机访问文件 388
14.8使用MemoryStream 391
14.9 StringReader和StringWriter 393
14.10把数值型字符串转换为内部表示格式 394
第15章 委托、事件和拉姆达表达式 399
15.1委托 399
15.1.1委托的方法组转换 402
15.1.2使用实例方法作为委托 402
15.1.3多播委托 404
15.1.4协变和逆变 406
15.1.5 System.Delegate 408
15.1.6使用委托的原因 408
15.2匿名函数 408
15.3匿名方法 408
15.3.1给匿名方法传递参数 409
15.3.2从匿名方法中返回一个值 410
15.3.3在匿名方法中使用外部变量 411
15.4拉姆达表达式 413
15.4.1拉姆达运算符 413
15.4.2表达式拉姆达 413
15.4.3语句拉姆达 416
15.5事件 418
15.5.1多播委托事件的示例 420
15.5.2作为事件处理程序的实例方法和静态方法的区别 422
15.5.3使用事件存取器 424
15.5.4事件的其他特性 429
15.6对事件使用匿名方法和拉姆达表达式 429
15.7 .NET事件的规则 430
15.8事件的应用:案例分析 433
第16章 名称空间、预处理器和程序集 437
16.1名称空间 437
16.1.1名称空间的声明 437
16.1.2名称空间可以避免名称冲突 440
16.1.3 using命令 441
16.1.4 using命令的另一种形式 443
16.1.5名称空间的合成 445
16.1.6嵌套名称空间 446
16.1.7全局名称空间 448
16.1.8使用名称空间别名限定符(∷) 448
16.2预处理器 452
16.2.1 #define 452
16.2.2 #if和#endif 453
16.2.3 #else和#elif 454
16.2.4 #undef 456
16.2.5 #error 456
16.2.6 #warning 457
16.2.7 #line 457
16.2.8 #region和#endregion 457
16.2.9 #pragma 457
16.3程序集和internal访问修饰符 458
第17章 运行时类型标识、反射和特性 461
17.1运行时类型标识 461
17.1.1使用is运算符测试类型 461
17.1.2使用as运算符 462
17.1.3使用typeof运算符 464
17.2反射 465
17.3使用反射 467
17.3.1获取方法的相关信息 467
17.3.2 GetMethods()的另一种形式 470
17.3.3使用反射调用方法 471
17.3.4获取Type对象的构造函数 474
17.3.5从程序集获得类型 478
17.3.6全自动类型查询 483
17.4特性 486
17.4.1特性基础 486
17.4.2创建特性 486
17.4.3连接特性 487
17.4.4获取对象的特性 487
17.4.5位置参数和命名参数 489
17.5三个内置特性 493
17.5.1 AttributeUsage特性 493
17.5.2 Conditional特性 494
17.5.3 Obsolete特性 495
第18章 泛型 497
18.1泛型概念 497
18.2一个简单的泛型示例 498
18.2.1泛型类型因类型参数的不同而不同 501
18.2.2泛型如何实现类型安全 501
18.3使用两个类型参数的泛型类 504
18.4泛型类的通用形式 505
18.5类型约束 505
18.5.1基类约束 506
18.5.2接口约束 514
18.5.3 new()构造函数约束 518
18.5.4引用类型和值类型约束 519
18.5.5使用约束建立两个类型参数之间的关系 522
18.5.6使用多重约束 523
18.6创建类型参数的默认值 524
18.7泛型结构 525
18.8创建泛型方法 526
18.8.1调用泛型方法时显式地指定类型实参 529
18.8.2为泛型方法指定约束 529
18.9泛型委托 529
18.10泛型接口 532
18.11比较同一类型参数的实例 536
18.12泛型类的层次结构 539
18.12.1使用泛型基类 539
18.12.2泛型派生类 541
18.13重写泛型类中的虚方法 542
18.14重载带类型参数的方法 544
18.15 泛型类型的实例化 545
18.16使用泛型时的一些局限 546
18.17小结 546
第19章LINQ 547
19.1 LINQ的定义 547
19.2 LINQ的基础知识 548
19.2.1简单查询 548
19.2.2查询可以多次执行 550
19.2.3查询中的数据类型的关联方式 551
19.2.4查询的一般形式 552
19.3使用where子句筛选值 552
19.4使用orderby子句排序结果 554
19.5深入讨论select子句 558
19.6使用嵌套的from子句 561
19.7使用group子句分组结果 562
19.8使用into子句创建继续 564
19.9在查询中使用let子句创建变量 566
19.10使用join子句连接两个序列 567
19.11匿名类型 570
19.12创建组连接 572
19.13查询方法 575
19.13.1基本查询方法 575
19.13.2使用查询方法创建查询 576
19.13.3查询语法与查询方法的对比 578
19.13.4更多与查询相关的扩展方法 578
19.14延期执行查询和立即执行查询 581
19.15 表达式树 582
19.16扩展方法 583
第20章 不安全代码、指针、空类型和其他主题 587
20.1不安全代码 587
20.1.1指针基础 588
20.1.2使用unsafe关键字 589
20.1.3使用fixed修饰符 590
20.1.4通过指针访问结构成员 591
20.1.5指针运算 591
20.1.6指针的比较 593
20.1.7指针和数组 593
20.1.8指针和字符串 595
20.1.9多重间接寻址 596
20.1.10指针数组 597
20.1.11 sizeof 597
20.1.12 stackalloc 597
20.1.13创建固定大小的缓冲区 598
20.2空类型 599
20.2.1空类型基础 600
20.2.2表达式中的空对象 601
20.2.3??运算符 602
20.2.4在空对象上使用关系和逻辑运算符 603
20.3部分类型 604
20.4部分方法 605
20.5友元程序集 606
20.6其他关键字 607
20.6.1 lock关键字 607
20.6.2 readonly关键字 607
20.6.3 const和volatile关键字 608
20.6.4 using语句 608
20.7 extern关键字 609
20.7.1声明extern方法 610
20.7.2声明extern程序集别名 611
第Ⅱ部分C#类库研究 615
第21章 研究System名称空间 615
21.1 System的成员 615
21.2 Math类 617
21.3与内置值类型对应的.NET结构 622
21.3.1整型结构 623
21.3.2浮点类型结构 625
21.3.3 Decimal结构 628
21.3.4 Char结构 633
21.3.5 Boolean结构 638
21.4 Array类 639
21.4.1排序和搜索数组 646
21.4.2反转数组 649
21.4.3复制数组 649
21.4.4使用谓词 650
21.4.5使用Action委托 652
21.5 BitConverter类 653
21.6用Random产生随机数 655
21.7内存管理和GC类 656
21.8 Object类 657
21.9 IComparable和IComparable<T>接口 657
21.10 IEquatable<T>接口 658
21.11 IConvertible接口 658
21.12 ICloneable接口 658
21.13 IFormatProvider接口和IFormattable接口 660
第22章 字符串和格式化 663
22.1 C#中的字符串 663
22.2 String类 663
22.2.1字符串构造函数 664
22.2.2 String类的字段、索引器和属性 664
22.2.3字符串运算符 665
22.2.4字符串方法 665
22.2.5填充和剪裁字符串 679
22.2.6插入、删除和替换 681
22.2.7改变字母大小写 682
22.2.8使用Substring()方法 682
22.2.9字符串扩展方法 683
22.3格式化类型 683
22.3.1格式化类型概述 683
22.3.2数值型数据的格式说明符 684
22.3.3理解参数编号 686
22.4使用String.Format()和ToString()格式化数据 686
22.4.1使用String.Format()格式化值 686
22.4.2使用ToString()格式化数据 689
22.5自定义数字格式 690
22.6格式化日期和时间 693
22.7格式化枚举 697
第23章 多线程程序设计 701
23.1多线程基础 701
23.2 Thread类 702
23.2.1创建和启动线程 702
23.2.2一些简单的改进 705
23.2.3创建多个线程 706
23.3确定线程结束的时间 708
23.4为线程传递参数 710
23.5 IsBackground属性 712
23.6线程优先级 713
23.7同步 715
23.7.1实现同步的另一种方式 719
23.7.2 Monitor类和锁 720
23.8使用Wait()、 Pulse()和PulseAll()实现线程通信 721
23.8.1 Wait()和Pulse()的示例 721
23.8.2死锁和竞争条件 725
23.9使用MethodImplAttribute属性 725
23.10使用互斥锁和信号量 727
23.10.1互斥锁 727
23.10.2信号量 731
23.11使用事件 734
23.12 Interlocked类 736
23.13终止线程 737
23.13.1 Abort()的另一种形式 739
23.13.2取消Abort() 740
23.14挂起和恢复线程 742
23.15 判断线程的状态 742
23.16使用主线程 742
23.17多线程编程提示 744
23.18开启独立任务 744
第24章 集合、枚举器和迭代器 747
24.1集合概述 747
24.2非泛型集合 748
24.2.1非泛型接口 748
24.2.2 DictionaryEntry结构 752
24.2.3非泛型集合类 753
24.3使用BitArray类存储位 768
24.4专用集合 770
24.5泛型集合 771
24.5.1泛型接口 771
24.5.2 KeyValuePair<TK,TV>结构 775
24.5.3泛型集合类 775
24.6在集合中存储用户自定义的类 793
24.7实现IComparable接口 795
24.7.1为非泛型集合实现IComparable接口 796
24.7.2为泛型集合实现IComparable<T>接口 797
24.8使用IComparer接口 799
24.8.1使用非泛型的IComparer 799
24.8.2使用泛型的IComparer<T> 800
24.9通过枚举器访问集合 802
24.9.1使用枚举器 802
24.9.2使用 IDictionaryEnumerator 803
24.10实现IEnumerable和IEnumerator接口 805
24.11迭代器 806
24.11.1停用迭代器 808
24.11.2使用多个yield指令 809
24.11.3创建命名迭代器 810
24.11.4创建泛型迭代器 811
24.12集合初始化器 812
第25章 通过 Internet连网 813
25.1 System.Net的成员 813
25.2统一资源标识符 815
25.3 Internet访问基础 815
25.3.1 WebRequest类 816
25.3.2 WebResponse类 818
25.3.3 HttpWebRequest类和HttpWebResponse类 819
25.3.4第一个简单的示例 819
25.4处理网络错误 821
25.4.1 Create()产生的异常 822
25.4.2 GetResponse()产生的异常 822
25.4.3 GetResponseStream()产生的异常 822
25.4.4使用异常处理 822
25.5 Uri类 824
25.6访问附加的HTTP响应信息 825
25.6.1访问报头 826
25.6.2访问Cookie 827
25.6.3使用LastModified属性 829
25.7 MiniCrawler:案例分析 829
25.8使用WebClient 833
第26章 使用System.Windows.Forms创建基于窗体的Windows应用程序 837
26.1 Windows程序设计简史 837
26.2编写基于窗体的 Windows应用程序的两种方式 838
26.3 Windows与用户交互操作的方法 838
26.4 Windows窗体 839
26.5基于窗体的Windows框架程序 839
26.6添加按钮 841
26.6.1按钮概述 842
26.6.2给窗体添加按钮 842
26.6.3简单的按钮示例 842
26.7消息处理 843
26.8使用消息框 845
26.9添加菜单 848
26.9.1创建传统样式的主菜单 848
26.9.2使用MenuStrip创建新式菜单 852
附录A文档注释快速参考 857