本书是一本不可多得的关于C# 4.0的教程和参考书。它在.NET 4.0和VS 2010的基础上,以图文并茂的形式,用朴实简洁的文字,并辅之以大量表格和代码示例,由浅入深、循序渐进地讲解了C#的方方面面,精炼而全面地阐述了C# 4.0的各种特性,使读者能够快速理解、学习和使用C#。
封面图
目录
- 前言
- 第一部分.NET体系结构
- 第1章 .NET体系结构2
- 1.1 .NET框架概述3
- 1.2 .NET的平台无关性4
- 1.3 公共语言运行时5
- 1.4 通用类型系统6
- 1.4.1 值类型和引用类型7
- 1.4.2 装箱和拆箱7
- 1.5 公共语言规范9
- 1.6 语言的互操作性9
- 1.7 即时编译10
- 1.8 中间语言10
- 1.9 基类库11
- 第2章 从“Hello World!”开始12
- 2.1 一个简单的C#程序12
- 2.2 编译和运行程序13
- 2.2.1 在Visual Studio 2010中编译
- 和运行13
- 2.2.2 通过命令行编译和运行14
- 2.3 详细介绍17
- 2.4 小结19
- 第二部分语法篇
- 第3章 标识符和关键字22
- 3.1 标识符22
- 3.2 关键字23
- 3.3 标识符的命名约定25
- 3.4 小结25
- 第4章 变量、常量和类型26
- 4.1 变量26
- 4.1.1 给变量命名26
- 4.1.2 声明变量27
- 4.1.3 变量的初始化27
- 4.1.4 类型推断29
- 4.1.5 变量的作用域30
- 4.2 常量32
- 4.3 数据类型33
- 4.3.1 内置的值类型34
- 4.3.2 内置的引用类型41
- 4.3.3 指针类型46
- 4.3.4 Nullable类型46
- 4.3.5 dynamic类型47
- 4.4 进阶阅读:关于动态语言运行时49
- 第5章 类型转换51
- 5.1 隐式类型转换51
- 5.1.1 数值类型52
- 5.1.2 引用类型53
- 5.1.3 装箱54
- 5.2 显式类型转换55
- 5.2.1 数值类型56
- 5.2.2 溢出检查57
- 5.2.3 引用类型58
- 5.2.4 拆箱58
- 5.3 as和is运算符59
- 第6章 表达式和运算符64
- 6.1 表达式64
- 6.2 运算符的类型65
- 6.3 运算符的优先级65
- 6.4 算术运算符66
- 6.5 求余运算符67
- 6.6 递增运算符和递减运算符68
- 6.7 关系和类型检测运算符69
- 6.8 相等性判断运算符70
- 6.9 条件运算符72
- 6.10 逻辑运算符73
- 6.11 位运算符74
- 6.12 赋值运算符75
- 6.13 typeof运算符76
- 6.14 运算符重载77
- 6.14.1 运算符的重载77
- 6.14.2 可重载的运算符78
- 第7章 语句79
- 7.1 什么是语句79
- 7.2 程序的三种结构79
- 7.2.1 顺序结构80
- 7.2.2 分支结构80
- 7.2.3 循环结构80
- 7.3 条件语句81
- 7.3.1 if语句81
- 7.3.2 switch语句84
- 7.4 跳转语句85
- 7.4.1 break语句86
- 7.4.2 continue语句87
- 7.4.3 return语句87
- 7.4.4 throw语句88
- 7.4.5 goto语句89
- 7.4.6 default语句89
- 7.5 标签语句89
- 7.5.1 标签90
- 7.5.2 标签语句的有效范围90
- 7.6 循环语句90
- 7.6.1 while循环90
- 7.6.2 do…while循环91
- 7.6.3 for循环92
- 7.6.4 foreach…in循环94
- 7.7 using语句95
- 第8章 方法97
- 8.1 方法的构成97
- 8.2 局部变量和常量98
- 8.3 方法的调用99
- 8.4 返回值101
- 8.5 参数101
- 8.5.1 形参102
- 8.5.2 实参102
- 8.5.3 新特性:命名和可选参数103
- 8.6 四种类型的参数106
- 8.6.1 按值传递参数106
- 8.6.2 按引用传递参数—
- 关键字:ref108
- 8.6.3 输出参数—关键字:out111
- 8.6.4 参数数组—关键字:
- params113
- 8.7 栈帧114
- 8.8 递归115
- 8.9 方法的重载116
- 8.10 静态方法117
- 第9章 类119
- 9.1 类是什么119
- 9.2 “Hello World!”程序回顾120
- 9.3 类的声明121
- 9.4 类的成员121
- 9.4.1 字段122
- 9.4.2 静态字段123
- 9.4.3 方法124
- 9.4.4 字段的初始化124
- 9.4.5 属性126
- 9.5 类的实例:对象135
- 9.6 实例化中的内存分配135
- 9.7 实例的成员136
- 9.8 this关键字136
- 9.9 访问修饰符137
- 9.10 访问类的成员138
- 9.10.1 从类内部访问成员139
- 9.10.2 从类外部访问成员139
- 9.10.3 从类外部访问静态成员140
- 9.11 构造函数140
- 9.12 对象初始化列表146
- 9.13 析构函数148
- 9.14 只读字段和常数150
- 9.15 索引器151
- 9.16 分部类型和分部方法—
- 修饰符:partial152
- 9.16.1 分部类153
- 9.16.2 分部方法155
- 9.17 注释158
- 9.17.1 行注释158
- 9.17.2 块注释159
- 9.17.3 XML文档注释160
- 第10章 继承163
- 10.1 类的继承163
- 10.2 访问继承的成员165
- 10.3 使用new修饰符隐藏基类的成员166
- 10.4 访问基类的成员167
- 10.5 类的初始化顺序168
- 10.6 在派生类中指定基类构造函数170
- 10.7 类的访问修饰符173
- 10.8 跨程序集的继承173
- 10.9 密封类175
- 10.10 静态类176
- 10.11 扩展方法177
- 10.12 派生类型的向上转型178
- 第11章 多态181
- 11.1 重载方法182
- 11.2 虚方法185
- 11.3 覆写方法186
- 11.4 覆写标记为override的方法188
- 11.5 抽象类及抽象方法190
- 第12章 接口192
- 12.1 定义接口193
- 12.2 声明和实现接口193
- 12.3 基类中的实现作为接口实现197
- 12.4 实现多个接口198
- 12.5 实现具有相同成员的接口199
- 12.6 显式接口成员实现200
- 12.7 调用显式接口成员实现202
- 12.8 接口的派生203
- 第13章 结构205
- 13.1 什么是结构205
- 13.2 结构是值类型206
- 13.3 给结构赋值208
- 13.4 构造函数209
- 13.4.1 实例构造函数209
- 13.4.2 静态构造函数211
- 13.5 多态和可继承性212
- 13.6 装箱和拆箱213
- 13.7 结构和类的对比214
- 13.7.1 字段初始化215
- 13.7.2 性能215
- 13.7.3 结构和类的适用场合分析217
- 第14章 枚举218
- 14.1 什么是枚举218
- 14.2 设置枚举的底层数据类型221
- 14.3 显式设置枚举的成员常量值222
- 14.4 使用标志枚举223
- 14.5 一些使用建议225
- 第15章 委托226
- 15.1 什么是委托226
- 15.2 委托是引用类型227
- 15.3 委托的声明和实例化227
- 15.4 委托的组合229
- 15.5 为委托添加一个方法230
- 15.6 从委托中删除一个方法231
- 15.7 委托在回调中的应用232
- 15.8 委托中的协变和逆变234
- 15.9 匿名方法236
- 15.10 l表达式238
- 第16章 事件240
- 16.1 什么是事件240
- 16.2 事件和委托的关系241
- 16.3 如何声明事件241
- 16.4 订阅事件242
- 16.5 触发事件245
- 16.6 使用和扩展EventArgs类246
- 16.7 使用自定义委托247
- 16.8 事件访问器249
- 第17章 泛型251
- 17.1 什么是泛型251
- 17.2 泛型类型254
- 17.3 泛型类型的声明和实例化255
- 17.4 类型参数258
- 17.5 类型参数的约束259
- 17.5.1 where子句260
- 17.5.2 约束类型和顺序261
- 17.6 泛型类261
- 17.7 泛型结构264
- 17.8 泛型接口265
- 17.9 泛型委托267
- 17.10 泛型方法268
- 17.11 扩展方法和泛型类270
- 17.12 协变和逆变271
- 第18章 数组273
- 18.1 数组的声明273
- 18.2 数组的类型274
- 18.3 数组派生自Array对象275
- 18.4 实例化数组276
- 18.5 初始化数组277
- 18.5.1 显式初始化一维数组278
- 18.5.2 显式初始化矩形数组及要点279
- 18.5.3 隐式类型数组281
- 18.6 访问数组元素282
- 18.7 交错数组282
- 18.7.1 交错数组的声明283
- 18.7.2 交错数组的实例化283
- 18.7.3 交错数组的初始化284
- 18.8 矩形数组和交错数组的对比285
- 18.9 使用foreach和for语句访问数组287
- 18.9.1 foreach语句287
- 18.9.2 for语句288
- 18.9.3 迭代变量289
- 18.10 数组协变291
- 18.11 从Array对象继承的成员292
- 18.12 数组的浅复制和深复制294
- 第19章 集合298
- 19.1 集合接口298
- 19.2 常用的几种集合类型300
- 19.2.1 ArrayList301
- 19.2.2 Hashtable304
-
19.2.3 Queue和Queue
307 -
19.2.4 SortedList309 -
19.2.5 Stack和Stack 310 -
19.2.6 BitArray313 -
19.2.7 List 314 -
19.2.8 HashSet 323 -
19.3 自定义集合326 -
19.3.1 CollectionBase327 -
19.3.2 ReadOnlyCollectionBase331 -
19.4 迭代器333 -
19.5 泛型集合接口支持协变和逆变336 -
19.6 LINQ to Objects339 -
19.6.1 LINQ简介339 -
19.6.2 查询语法340 -
19.6.3 方法语法340 -
19.6.4 查询操作的组成341 -
19.6.5 关于查询变量342 -
19.6.6 查询语法和方法语法的统一342 -
第20章 字符串与正则表达式343 -
20.1 理解字符串343 -
20.2 字符串的常用成员345 -
20.3 字符串格式化351 -
20.4 使用StringBuilder类355 -
20.5 正则表达式357 -
20.5.1 正则表达式基本语法358 -
20.5.2 .NET对于正则表达式的 -
支持363 -
20.5.3 开始使用正则表达式366 -
第21章 异常处理368 -
21.1 异常类368 -
21.2 抛出异常369 -
21.3 捕获异常370 -
21.4 自定义的异常类373 -
21.5 异常处理的原则374 -
第22章 命名空间和程序集375 -
22.1 命名空间375 -
22.1.1 使用命名空间376 -
22.1.2 使用别名378 -
22.2 程序集378 -
22.2.1 程序集的结构380 -
22.2.2 程序集清单381 -
22.2.3 私有程序集和共享程序集382 -
22.2.4 应用程序域383 -
22.2.5 创建动态程序集并动态 -
加载执行384 -
22.2.6 全局程序集缓存387 -
第23章 预处理指令391 -
23.1 什么是预处理指令391 -
23.2 观察一段示例391 -
23.3 预处理指令集393 -
23.4 #define和#undef指令393 -
23.5 条件编译指令394 -
23.6 #warning和#error指令396 -
23.7 #line指令396 -
23.8 #region和#endregion指令399 -
23.9 #pragma warning指令400 -
第24章 元数据和特性401 -
24.1 元数据401 -
24.1.1 从IntelliSense谈起405 -
24.1.2 访问元数据406 -
24.2 特性(Attribute)412 -
24.2.1 什么是特性414 -
24.2.2 创建自定义特性418 -
24.2.3 访问特性424 -
24.2.4 常用特性425 -
24.2.5 特性应用完整示例433 -
第25章 异步编程和多线程编程437 -
25.1 进程和线程437 -
25.2 BeginInvoke和EndInvoke439 -
25.3 IAsyncResult接口和 -
AsyncResult类440 -
25.4 异步编程的4种方法441 -
25.4.1 使用EndInvoke441 -
25.4.2 使用WaitHandle442 -
25.4.3 轮询444 -
25.4.4 回调445 -
25.5 多线程编程446 -
25.5.1 Thread类447 -
25.5.2 使用线程池448 -
25.5.3 线程同步450 -
25.5.4 死锁453 -
第26章 I/O操作457 -
26.1 文件和目录457 -
26.1.1 File和Directory457 -
26.1.2 FileInfo和DirectoryInfo459 -
26.1.3 文件I/O的改进462 -
26.2 流467 -
26.3 异步操作470 -
26.4 网络流的使用472 -
26.5 序列化476 -
26.5.1 BinaryFormatter478 -
26.5.2 SoapFormatter480 -
26.5.3 XML序列化483 -
26.6 独立存储机制485 -
第27章 XML处理488 -
27.1 System.Xml命名空间488 -
27.2 使用DOM489 -
27.3 XPath和XSLT493 -
27.4 LINQ to XML498 -
27.4.1 LINQ to XML类库介绍498 -
27.4.2 创建XML文档498 -
27.4.3 使用LINQ进行遍历和查询499 -
27.4.4 修改XML文档500 -
第28章 增强的COM Interop502 -
28.1 Dynamic lookup502 -
28.1.1 dynamic关键字503 -
28.1.2 访问Python代码504 -
28.1.3 访问COM对象506 -
28.2 改进的参数传递508 -
28.3 完整示例512 -
第29章 并行编程515 -
29.1 任务并行库516 -
29.1.1 并发和并行517 -
29.1.2 并行编程架构517 -
29.2 Parallel类518 -
29.2.1 For方法重载一520 -
29.2.2 For方法重载二521 -
29.2.3 For方法重载三525 -
29.3 Task类和Task 类526 -
29.4 数据并行528 -
29.5 任务并行531 -
29.6 TaskFactory类和TaskFactory 类533 -
29.6.1 任务创建选项535 -
29.6.2 并发选项548 -
29.6.3 后续任务选项550 -
29.7 PLINQ559 -
第三部分附录 -
附录A Visual Studio 2010 -
快速入门564 -
附录B C#编码规范597