正文
《深入理解C#(第3版)》
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
《深入理解C#(第3版)》
基本信息
原书名:C# in depth
作者: (英)Jon Skeet
译者: 姚琪琳
丛书名: 图灵程序设计丛书
出版社:人民邮电出版社
ISBN:9787115346421
上架时间:2014-3-11
出版日期:2014 年4月
开本:16开
页码:1
版次:1-1
所属分类:计算机 > 软件与程序设计 > C/Turbo C > 综合
更多关于》》》《深入理解C#(第3版)》
编辑推荐
资深C# MVP扛鼎之作
深入理解语言特性,探究本源
.NET开发人员必读经典
内容简介
书籍
计算机书籍
《深入理解c#(第3版)》是c# 领域不可多得的经典著作。作者在详尽地展示c# 各个知识点的同时,更注重从现象中挖掘本质。本书深入探索了c# 的核心概念和经典特性,并将这些特性融入到代码中,让读者能够真正领会到c# 之“深入”与“精妙”。在第2 版的基础上,本书新增了c# 5 的新特性——异步,并更新了随着技术的发展,已经不再适用的内容,确保整本书能达到读者期望的高标准。
如果你略微了解一点c#,就可无障碍地阅读本书。
媒体评论
“学习C#语言特性的最佳资源。”
——Andy Kirsch,Venga
“本书使我的C#水平更上一层楼。”
——Dustin Laine,Code Harvest
“每一位.NET开发人员都至少应该阅读一遍的案头必备图书。”
——Dror Helper,Better Place
“本书无疑是我读过的最佳C#参考书。”
——Jon Parish,Datasift
目录
《深入理解c#(第3版)》
第一部分基础知识
第1章c#开发的进化史2
1.1 从简单的数据类型开始3
1.1.1 c# 1中定义的产品类型3
1.1.2 c# 2中的强类型集合4
1.1.3 c# 3中自动实现的属性5
1.1.4 c# 4中的命名实参6
1.2 排序和过滤7
1.2.1 按名称对产品进行排序7
1.2.2 查询集合10
1.3 处理未知数据12
1.3.1 表示未知的价格12
1.3.2 可选参数和默认值13
1.4 linq简介14
1.4.1 查询表达式和进程内查询14
1.4.2 查询xml15
1.4.3 linq to sql16
1.5 com和动态类型17
1.5.1 简化com互操作17
1.5.2 与动态语言互操作18
1.6 轻松编写异步代码19
1.7 剖析.net平台20
1.7.1 c#语言20
1.7.2 运行时21
1.7.3 框架库21
1.8 怎样写出超炫的代码22
1.8.1 采用代码段形式的全能代码22
1.8.2 教学代码不是产品代码23
1.8.3 你的新朋友:语言规范23
1.9 小结24
第2章c# 1所搭建的核心基础25
2.1 委托25
2.1.1 简单委托的构成26
2.1.2 合并和删除委托30
2.1.3 对事件的简单讨论32
2.1.4 委托总结33
2.2 类型系统的特征33
2.2.1 c#在类型系统世界中的位置34
2.2.2 c# 1的类型系统何时不够用36
2.2.3 类型系统特征总结39
2.3 值类型和引用类型39
2.3.1 现实世界中的值和引用39
2.3.2 值类型和引用类型基础知识40
2.3.3 走出误区41
2.3.4 装箱和拆箱43
2.3.5 值类型和引用类型小结44
2.4 c# 1之外:构建于坚实基础之上的新特性44
2.4.1 与委托有关的特性44
2.4.2 与类型系统有关的特性46
2.4.3 与值类型有关的特性48
2.5 小结49
第二部分c# 2 :解决c# 1 的问题
第3章用泛型实现参数化类型52
3.1 为什么需要泛型53
3.2 日常使用的简单泛型54
3.2.1 通过例子来学习:泛型字典54
3.2.2 泛型类型和类型参数56
3.2.3 泛型方法和判读泛型声明59
3.3 深化与提高62
3.3.1 类型约束62
3.3.2 泛型方法类型实参的类型推断67
3.3.3 实现泛型68
3.4 高级泛型73
3.4.1 静态字段和静态构造函数73
3.4.2 jit编译器如何处理泛型75
3.4.3 泛型迭代77
3.4.4 反射和泛型79
3.5 泛型在c#和其他语言中的限制82
3.5.1 泛型可变性的缺乏83
3.5.2 缺乏操作符约束或者“数值”约束87
3.5.3 缺乏泛型属性、索引器和其他成员类型88
3.5.4 同c++模板的对比89
3.5.5 和java泛型的对比90
3.6 小结91
第4章可空类型93
4.1 没有值时怎么办93
4.1.1 为什么值类型的变量不能是null94
4.1.2 在c# 1中表示空值的模式94
4.2 system.nullable(t)和system.nullable96
4.2.1 nullable(t)简介96
4.2.2 nullable(t)装箱和拆箱99
4.2.3 nullable(t)实例的相等性100
4.2.4 来自非泛型nullable类的支持101
4.3 c# 2为可空类型提供的语法糖101
4.3.1 ?修饰符102
4.3.2 使用null进行赋值和比较103
4.3.3 可空转换和操作符105
4.3.4 可空逻辑108
4.3.5 对可空类型使用as操作符109
4.3.6 空合并操作符110
4.4 可空类型的新奇用法112
4.4.1 尝试一个不使用输出参数的操作113
4.4.2 空合并操作符让比较不再痛苦115
4.5 小结117
第5章进入快速通道的委托118
5.1 向笨拙的委托语法说拜拜119
5.2 方法组转换120
5.3 协变性和逆变性122
5.3.1 委托参数的逆变性122
5.3.2 委托返回类型的协变性123
5.3.3 不兼容的风险124
5.4 使用匿名方法的内联委托操作125
5.4.1 从简单的开始:处理一个参数126
5.4.2 匿名方法的返回值128
5.4.3 忽略委托参数129
5.5 匿名方法中的捕获变量131
5.5.1 定义闭包和不同类型的变量131
5.5.2 捕获变量的行为132
5.5.3 捕获变量到底有什么用处133
5.5.4 捕获变量的延长生存期134
5.5.5 局部变量实例化135
5.5.6 共享和非共享的变量混合使用137
5.5.7 捕获变量的使用规则和小结139
5.6 小结140
第6章实现迭代器的捷径141
6.1 c# 1:手写迭代器的痛苦142
6.2 c# 2:利用yield语句简化迭代器144
6.2.1 迭代器块和yield return简介145
6.2.2 观察迭代器的工作流程146
6.2.3 进一步了解迭代器执行流程148
6.2.4 具体实现中的奇特之处151
6.3 真实的迭代器示例152
6.3.1 迭代时刻表中的日期152
6.3.2 迭代文件中的行153
6.3.3 使用迭代器块和谓词对项进行延迟过滤156
6.4 使用ccr实现伪同步代码157
6.5 小结160
第7章结束c# 2的讲解:最后的一些特性161
7.1 分部类型162
7.1.1 在多个文件中创建一个类型162
7.1.2 分部类型的使用164
7.1.3 c# 3独有的分部方法166
7.2 静态类型167
7.3 独立的取值方法/赋值方法属性访问器169
7.4 命名空间别名170
7.4.1 限定的命名空间别名171
7.4.2 全局命名空间别名172
7.4.3 外部别名173
7.5 pragma指令174
7.5.1 警告pragma174
7.5.2 校验和pragma175
7.6 非安全代码中固定大小的缓冲区176
7.7 把内部成员暴露给选定的程序集178
7.7.1 简单情况下的友元程序集178
7.7.2 为什么使用internals-visibleto179
7.7.3 internalsvisibleto和签名程序集179
7.8 小结180
第三部分c# 3 :革新写代码的方式
第8章用智能的编译器来防错182
8.1 自动实现的属性183
8.2 隐式类型的局部变量185
8.2.1 用var声明局部变量185
8.2.2 隐式类型的限制187
8.2.3 隐式类型的优缺点188
8.2.4 建议189
8.3 简化的初始化190
8.3.1 定义示例类型190
8.3.2 设置简单属性191
8.3.3 为嵌入对象设置属性192
8.3.4 集合初始化程序193
8.3.5 初始化特性的应用196
8.4 隐式类型的数组197
8.5 匿名类型198
8.5.1 第一次邂逅匿名类型198
8.5.2 匿名类型的成员200
8.5.3 投影初始化程序201
8.5.4 重点何在202
8.6 小结203
第9章lambda表达式和表达式树204
9.1 作为委托的lambda表达式205
9.1.1 准备工作:func(...)委托类型简介205
9.1.2 第一次转换成lambda表达式206
9.1.3 用单一表达式作为主体207
9.1.4 隐式类型的参数列表207
9.1.5 单一参数的快捷语法208
9.2 使用list(t)和事件的简单例子209
9.2.1 列表的过滤、排序和操作210
9.2.2 在事件处理程序中进行记录211
9.3 表达式树212
9.3.1 以编程方式构建表达式树213
9.3.2 将表达式树编译成委托214
9.3.3 将c# lambda表达式转换成表达式树215
9.3.4 位于linq核心的表达式树218
9.3.5 linq之外的表达式树220
9.4 类型推断和重载决策的改变221
9.4.1 改变的起因:精简泛型方法调用221
9.4.2 推断匿名函数的返回类型222
9.4.3 分两个阶段进行的类型推断223
9.4.4 选择正确的被重载的方法227
9.4.5 类型推断和重载决策229
9.5 小结229
第10章扩展方法230
10.1 未引入扩展方法之前的状态231
10.2 扩展方法的语法233
10.2.1 声明扩展方法233
10.2.2 调用扩展方法234
10.2.3 扩展方法是怎样被发现的235
10.2.4 在空引用上调用方法236
10.3 .net 3.5中的扩展方法238
10.3.1 从enumerable开始起步238
10.3.2 用where过滤并将方法调用链接到一起240
10.3.3 插曲:似曾相识的where方法241
10.3.4 用select方法和匿名类型进行投影242
10.3.5 用orderby方法进行排序243
10.3.6 涉及链接的实际例子244
10.4 使用思路和原则245
10.4.1 “扩展世界”和使接口更丰富246
10.4.2 流畅接口246
10.4.3 理智使用扩展方法248
10.5 小结249
第11章查询表达式和linq to objects250
11.1 linq介绍251
11.1.1 linq中的基础概念251
11.1.2 定义示例数据模型255
11.2 简单的开始:选择元素256
11.2.1 以数据源作为开始,以选择作为结束257
11.2.2 编译器转译是查询表达式基础的转译257
11.2.3 范围变量和重要的投影260
11.2.4 cast、oftype和显式类型的范围变量262
11.3 对序列进行过滤和排序264
11.3.1 使用where子句进行过滤264
11.3.2 退化的查询表达式265
11.3.3 使用orderby子句进行排序265
11.4 let子句和透明标识符267
11.4.1 用let来进行中间计算267
11.4.2 透明标识符268
11.5 连接270
11.5.1 使用join子句的内连接270
11.5.2 使用join...into子句进行分组连接274
11.5.3 使用多个from子句进行交叉连接和合并序列276
11.6 分组和延续279
11.6.1 使用group...by子句进行分组279
11.6.2 查询延续282
11.7 在查询表达式和点标记之间作出选择285
11.7.1 需要使用点标记的操作285
11.7.2 使用点标记可能会更简单的查询表达式286
11.7.3 选择查询表达式286
11.8 小结287
第12章超越集合的linq289
12.1 使用linq to sql查询数据库290
12.1.1 数据库和模型290
12.1.2 用查询表达式访问数据库292
12.1.3 包含连接的查询294
12.2 用iqueryable和iqueryprovider进行转换296
12.2.1 iqueryable(t)和相关接口的介绍297
12.2.2 模拟接口实现来记录调用298
12.2.3 把表达式粘合在一起:queryable的扩展方法300
12.2.4 模拟实际运行的查询提供器302
12.2.5 包装iqueryable303
12.3 linq友好的api和linq to xml303
12.3.1 linq to xml中的核心类型304
12.3.2 声明式构造305
12.3.3 查询单个节点308
12.3.4 合并查询操作符309
12.3.5 与linq和谐共处310
12.4 用并行linq代替linq to objects311
12.4.1 在单线程中绘制曼德博罗特集311
12.4.2 parallelenumerable、parallelquery和asparallel313
12.4.3 调整并行查询315
12.5 使用linq to rx反转查询模型316
12.5.1 iobservable(t)和iobserver(t)316
12.5.2 简单的开始318
12.5.3 查询可观察对象319
12.5.4 意义何在321
12.6 扩展linq to objects321
12.6.1 设计和实现指南322
12.6.2 示例扩展:选择随机元素323
12.7 小结324
第四部分c# 4 :良好的交互性
第13章简化代码的微小修改328
13.1 可选参数和命名实参328
13.1.1 可选参数329
13.1.2 命名实参334
13.1.3 两者相结合337
13.2 改善com互操作性341
13.2.1 在c# 4之前操纵word是十分恐怖的342
13.2.2 可选参数和命名实参的复仇342
13.2.3 按值传递ref参数343
13.2.4 调用命名索引器344
13.2.5 链接主互操作程序集345
13.3 接口和委托的泛型可变性348
13.3.1 可变性的种类:协变性和逆变性348
13.3.2 在接口中使用可变性349
13.3.3 在委托中使用可变性352
13.3.4 复杂情况353
13.3.5 限制和说明354
13.4 对锁和字段风格的事件的微小改变357
13.4.1 健壮的锁357
13.4.2 字段风格的事件358
13.5 小结359
第14章静态语言中的动态绑定360
14.1 何谓、何时、为何、如何361
14.1.1 何谓动态类型361
14.1.2 动态类型什么时候有用,为什么362
14.1.3 c# 4如何提供动态类型363
14.2 关于动态的快速指南364
14.3 动态类型示例366
14.3.1 com和office367
14.3.2 动态语言368
14.3.3 纯托管代码中的动态类型372
14.4 幕后原理377
14.4.1 dlr简介378
14.4.2 dlr核心概念379
14.4.3 c#编译器如何处理动态382
14.4.4 更加智能的c#编译器385
14.4.5 动态代码的约束388
14.5 实现动态行为390
14.5.1 使用expandoobject391
14.5.2 使用dynamicobject394
14.5.3实现idynamicmetaobject-provider400
14.6 小结404
第五部分c# 5:简化的异步编程
第15章使用async/await进行异步编程406
15.1 异步函数简介407
15.1.1 初识异步类型408
15.1.2 分解第一个示例409
15.2 思考异步编程410
15.2.1 异步执行的基础410
15.2.2 异步方法412
15.3 语法和语义413
15.3.1 声明异步方法413
15.3.2 异步方法的返回类型414
15.3.3 可等待模式415
15.3.4 await表达式的流418
15.3.5 从异步方法返回421
15.3.6 异常422
15.4 异步匿名函数429
15.5 实现细节:编译器转换431
15.5.1 生成的代码432
15.5.2 骨架方法的结构434
15.5.3 状态机的结构435
15.5.4 一个入口搞定一切436
15.5.5 围绕await表达式的控制438
15.5.6 跟踪栈439
15.5.7 更多内容440
15.6 高效地使用async/await441
15.6.1 基于任务的异步模式441
15.6.2 组合异步操作444
15.6.3 对异步代码编写单元测试447
15.6.4 可等待模式的归来450
15.6.5 在winrt中执行异步操作451
15.7 小结452
第16章c# 5附加特性和结束语453
16.1 foreach循环中捕获变量的变化453
16.2 调用者信息特性454
16.2.1 基本行为454
16.2.2 日志456
16.2.3 实现inotifyproperty-changed456
16.2.4 在非.net 4.5环境下使用调用者信息特性457
16.3 结束语458
附录a linq标准查询操作符460
附录b .net中的泛型集合471
附录c 版本总结483
本图书信息来源:互动出版网