《深入理解C# 第3版》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:(英)斯基特著
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2014
  • ISBN:9787115346421
  • 页数:490 页
图书介绍:本书是C#领域不可多得的经典著作,新版全面更新并剖析了C#5的新特性,作者在详尽展示C#各个知识点的同时,更注重从现象中挖掘本质,深入探索了C#的核心概念和经典特性,并将这些特性融入到代码中,非常适合中高级.NET开发人员阅读。

第一部分 基础知识 2

第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的问题 52

第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.3InternalsVisibleTo和签名程序集 179

7.8小结 180

第三部分 C# 3:革新写代码的方式 182

第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.1IQueryable〈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.1Iobservable〈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:良好的交互性 328

第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使用Expandoobj ect 391

14.5.2使用Dynamicobj ect 394

14.5.3实现IDynamicMetaobject-Provider 400

14.6小结 404

第五部分C# 5:简化的异步编程 406

第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