《深入理解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 查询xml  15

1.4.3 linq to sql  16

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 为什么值类型的变量不能是null  94

4.1.2 在c# 1中表示空值的模式  94

4.2 system.nullable(t)和system.nullable  96

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 警告pragma  174

7.5.2 校验和pragma  175

7.6 非安全代码中固定大小的缓冲区  176

7.7 把内部成员暴露给选定的程序集  178

7.7.1 简单情况下的友元程序集  178

7.7.2 为什么使用internals-visibleto  179

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 objects  250

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章 超越集合的linq  289

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 包装iqueryable  303

12.3 linq友好的api和linq to xml  303

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 objects  311

12.4.1 在单线程中绘制曼德博罗特集  311

12.4.2 parallelenumerable、parallelquery和asparallel  313

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 objects  321

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和office  367

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 使用expandoobject  391

14.5.2 使用dynamicobject  394

14.5.3  实现idynamicmetaobject-provider  400

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/await  441

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-changed  456

16.2.4 在非.net 4.5环境下使用调用者信息特性  457

16.3 结束语  458

附录a linq标准查询操作符  460

附录b .net中的泛型集合  471

附录c 版本总结  483

本图书信息来源:互动出版

《深入理解C#(第3版)》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. WangSql 3.0源码共享(WangSql 1.0重大升级到3.0)

    WangSql 1.0博文阅读: http://www.cnblogs.com/deeround/p/6204610.html 基于1.0做了以下重大改动: 1.多数据实现方式调整 2.使用EmitM ...

  2. 基于 Struts2 的文件下载

    介于上篇我们讲述了基于 Struts2 的单文件和多文件上传,这篇我们来聊一聊基于 Struts2 的文件下载. 1.导 jar 包 commons-io-2.0.1.jar struts2-core ...

  3. Educational Codeforces Round 45 (Rated for Div. 2) E - Post Lamps

    E - Post Lamps 思路:一开始看错题,以为一个地方不能重复覆盖,我一想值这不是sb题吗,直接每个power check一下就好....复杂度nlogn 然后发现不是,这样的话,对于每个po ...

  4. span 超出内容自动换行

    <span style="width:80%;word-break:normal;display:block;word-warp:break-word;overflow:hidden; ...

  5. OpenCV 基础笔记

    本文大部分内容来源于入门者的Python快速教程 - 番外篇之Python-OpenCV 本篇将介绍和深度学习数据处理阶段最相关的基础使用,并完成4个有趣实用的小例子: 延时摄影小程序 视频中截屏采样 ...

  6. 在centOS使用systemctl配置启动多个tomcat

    公司服务器使用的是阿里云CentOS7,CentOS7和CentOS6目前最大区别就是service变成了现在的systemctl,简单的查了一下并结合使用,发现systemctl功能上等同于6上面的 ...

  7. zip函数实际应用

    一个需求,把两个列表要同时用for循环贴到模板上,用zip在后端组成  元祖组成的列表  这样在模板就可以用.0   .1的方式,类似python中 x[0]   x[1] 显示出来. html显示: ...

  8. lamp 5.6.36 bug记录

    后来发现另一个问题,php文字水印中文是乱码. 用yum安装lamp环境详见:https://blog.csdn.net/u010071211/article/details/80370201 在ce ...

  9. Kali2.0通过xrdp实现windows远程链接Linux

    标题:Kali2.0通过xrdp实现windows远程链接Linux apt-get install xrdp 首先需要安装xrdp 接下来安装xfce4 apt-get install xfce4 ...

  10. N!(N的阶乘)最末位非0的求解方法

    问题是求关于N!的最后一位非0位, 如3!=6,最后一位非0位为6, 5!=120, 最后一位非0位为2.怎么样快速的求出最后一位非0位呢? 最朴素的想法就是先求出N!的结果,再求出结果的最后一位非0 ...