图书介绍

C#从现象到本质【2025|PDF|Epub|mobi|kindle电子书版本百度云盘下载】

C#从现象到本质
  • 郝亦非著 著
  • 出版社: 北京:机械工业出版社
  • ISBN:9787111604402
  • 出版时间:2018
  • 标注页数:614页
  • 文件大小:91MB
  • 文件页数:638页
  • 主题词:C语言-程序设计

PDF下载


点此进入-本书在线PDF格式电子书下载【推荐-云解压-方便快捷】直接下载PDF格式图书。移动端-PC端通用
种子下载[BT下载速度快]温馨提示:(请使用BT下载软件FDM进行下载)软件下载地址页直链下载[便捷但速度慢]  [在线试读本书]   [在线获取解压码]

下载说明

C#从现象到本质PDF格式电子书版下载

下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。

建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!

(文件页数 要大于 标注页数,上中下等多册电子书除外)

注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具

图书目录

第一部分 基础知识2

第1章 .NET基础知识2

1.1 .NET框架介绍2

1.2 .NET框架发展史3

1.3 .NET框架的主要成员5

1.3.1 两步编译与跨平台5

1.3.2 CLR6

1.3.3 CLI7

1.3.4 CTS和CLS8

1.3.5 框架类库(FCL)8

1.3.6 基础类库(BCL)9

1.4 程序集10

1.4.1 反向工程——使用ILSpy观察IL10

1.4.2 程序集与托管模块11

1.4.3 程序集的部署18

1.5 .NET程序的编译:IL与JIT20

1.5.1 什么是IL (CIL)21

1.5.2 初识IL21

1.5.3 System.Reflection.Emit31

1.5.4 即时编译(JIT)33

1.5.5 运行时的验证34

1.5.6 Visual Studio的编译模式与本地代码的优化34

1.5.7 托管代码与非托管代码的互操作性35

1.6 CLR启动与Hello World的运行36

1.7 本章小结37

1.8 思考题37

第2章 C#类型基础(上)38

2.1 公共类型系统38

2.2 堆与栈40

2.2.1 堆40

2.2.2 栈41

2.3 引用类型的内存分配42

2.3.1 字段的对齐44

2.3.2 同步块索引45

2.3.3 方法表指针和类型对象45

2.3.4 静态字段和属性46

2.4 使用WinDbg探查内存46

2.4.1 WinDbg简易命令速查47

2.4.2 使用WinDbg探查引用类型47

2.4.3 引用类型的复制52

2.5 值类型53

2.5.1 基元类型54

2.5.2 值类型的内存分配54

2.5.3 值类型的构造函数56

2.5.4 何时考虑使用值类型57

2.5.5 值类型是密封的58

2.5.6 值类型和引用类型的区别与联系58

2.5.7 嵌套:值类型与引用类型58

2.6 装箱和拆箱59

2.6.1 装箱的过程59

2.6.2 拆箱的过程60

2.6.3 如何避免拆箱和装箱60

2.7 本章小结61

2.8 思考题61

第3章 C#类型基础(下)62

3.1 类型的非方法成员62

3.1.1 常量62

3.1.2 字段63

3.1.3 无参属性64

3.1.4 有参属性66

3.1.5 属性的意义67

3.2 类型的构造函数和析构函数67

3.2.1 静态类67

3.2.2 实例构造函数(引用类型)68

3.2.3 实例构造函数(值类型)69

3.2.4 静态构造函数69

3.2.5 构造函数的执行顺序70

3.2.6 析构函数71

3.3 类型的普通方法成员72

3.3.1 方法表73

3.3.2 使用WinDbg探查方法表73

3.3.3 方法槽表与方法描述表在JIT前后的变化75

3.3.4 方法调用77

3.3.5 方法参数的按值传递和按引用传递80

3.4 类型转换82

3.4.1 将一个对象转换为它的基类型83

3.4.2 将一个对象转换为它的派生类型84

3.4.3 基元类型的类型转换84

3.4.4 自定义类型转换84

3.5 System.Object类型的主要方法85

3.6 本章小结90

3.7 思考题91

第4章 C#和面向对象92

4.1 面向对象程序设计92

4.2 继承93

4.2.1 方法表与继承94

4.2.2 再论Call与Callvirt94

4.2.3 IL中修饰方法的关键字95

4.2.4 方法的重载、重写和隐藏96

4.2.5 值类型的方法调用100

4.3 接口和多态101

4.3.1 抽象类与Is A关系102

4.3.2 接口与Has A关系102

4.3.3 显式接口实现103

4.3.4 显式接口实现与泛型接口104

4.3.5 抽象类vS接口105

4.3.6 接口不继承自Object106

4.3.7 接口方法分派106

4.4 面向对象编程五大原则(SOLID)106

4.4.1 单一职责原则107

4.4.2 开闭原则107

4.4.3 里氏代换原则111

4.4.4 接口隔离原则111

4.4.5 依赖倒转原则112

4.5 本章小结112

4.6 思考题113

第5章 字符串114

5.1 字符114

5.2 字符串的特性115

5.2.1 字符串与普通的引用类型相比116

5.2.2 IL中创建字符串116

5.2.3 字符串的不变性117

5.2.4 通过成员来证明不变性118

5.2.5 为什么要这么设计119

5.3 字符串驻留119

5.4 字符串的相加121

5.5 不变性只是针对托管代码124

5.6 本章小结125

5.7 思考题125

第6章 垃圾回收126

6.1 垃圾回收的概念127

6.1.1 GC堆的构造127

6.1.2 识别垃圾128

6.1.3 压缩136

6.1.4 C#的GC规则总结136

6.2 垃圾回收策略136

6.2.1 Dispose方法和IDisposible接口136

6.2.2 析构函数(终结器)137

6.2.3 如何回收托管资源140

6.2.4 如何回收非托管资源142

6.2.5 using关键字143

6.2.6 总结:怎样实现垃圾回收策略144

6.3 GC的工作模式145

6.3.1 工作站模式145

6.3.2 服务器模式146

6.4 大对象146

6.5 本章小结147

6.6 思考题147

第7章 异常与异常处理148

7.1 C#的异常处理149

7.1.1 try149

7.1.2 catch149

7.1.3 finally150

7.1.4 结构化异常处理152

7.1.5 throw和throw ex153

7.2 IL中的异常处理机制155

7.3 开发中的异常处理159

7.3.1 提高程序的健壮性159

7.3.2 使用.NET自带的日志类型159

7.4 本章小结163

7.5 思考题163

第二部分 C#特性166

第8章 委托和事件166

8.1 委托166

8.1.1 委托初探166

8.1.2 使用委托达到代码复用的目的168

8.1.3 委托的协变和逆变171

8.1.4 委托的本质171

8.1.5 委托链与多路广播174

8.1.6 委托的异步调用176

8.2 事件176

8.2.1 事件初探177

8.2.2 事件的本质180

8.2.3 Winform中的经典事件:单击按钮182

8.2.4 Windows消息机制简介183

8.2.5 观察者模式185

8.3 本章小结189

8.4 思考题189

第9章 泛型190

9.1 泛型方法190

9.1.1 类型安全与代码爆炸191

9.1.2 泛型类型的静态成员193

9.1.3 泛型与继承194

9.1.4 泛型约束194

9.1.5 泛型委托195

9.1.6 使用泛型委托达到代码复用的目的196

9.2 可空类型197

9.3 协变和逆变200

9.3.1 可变性200

9.3.2 通过反射调用泛型方法207

9.4 本章小结208

9.5 思考题208

第10章 反射209

10.1 初识反射209

10.1.1 获得类型的基本信息210

10.1.2 获得类型成员和方法调用211

10.1.3 加载程序集(晚期绑定)215

10.1.4 反射与泛型216

10.2 反射的应用场景218

10.3 反射的性能问题218

10.3.1 方法反射调用有多慢218

10.3.2 通过其他方法优化反射调用方式220

10.3.3 反射优化的性能比较225

10.4 反射的应用:一个简单的ORM225

10.4.1 通过反射和特性建立表格和实体的联系226

10.4.2 为实体增加主键227

10.4.3 建立本地数据库228

10.4.4 建立表格228

10.4.5 删除表格231

10.4.6 为表格插入数据231

10.4.7 选择数据233

10.4.8 多表联查怎么办234

10.4.9 优化ORM:使用委托来获得值235

10.4.10 完整的实现代码235

10.4.11 小结242

10.5 本章小结242

10.6 思考题243

第11章 C#的数据结构244

11.1 IEnumerable244

11.1.1 迭代器模式244

11.1.2 什么是IEnumerable245

11.1.3 实现一个继承IEnumerable的类型245

11.1.4 yield的延迟执行特性256

11.1.5 IEnumerable是一个可枚举序列,但不是容器257

11.1.6 在迭代的过程中改变集合的状态259

11.1.7 IEnumerable的缺点和总结259

11.2 IEnumerable的派生类260

11.2.1 Array260

11.2.2 ArrayList261

11.2.3 IDictionary262

11.3 IEnumerable〈T〉的派生类272

11.3.1 IList〈T〉272

11.3.2 LinkedList〈T〉272

11.3.3 Queue〈T〉281

11.3.4 Stack〈T〉283

11.3.5 IDictionary〈K,T〉284

11.3.6 ISet〈T〉287

11.4 常用数据结构特征以及操作时间复杂度288

11.5 如何选择数据结构289

11.6 本章小结289

11.7 思考题290

第12章 LINQ的准备工作291

12.1 匿名函数、捕获变量与闭包291

12.1.1 匿名函数291

12.1.2 演示捕获变量293

12.1.3 闭包300

12.2 LINQ的准备工作301

12.2.1 自动实现的属性302

12.2.2 隐式类型的局部变量302

12.2.3 匿名类型303

12.2.4 扩展方法305

12.3 Lambda表达式和表达式树306

12.3.1 从匿名函数到Lambda表达式306

12.3.2 表达式简介308

12.3.3 构建简单的表达式树309

12.3.4 表达式树与反射311

12.4 本章小结315

12.5 思考题315

第13章 LINQ to Object316

13.1 LINQPad316

13.2 Enumerable是什么318

13.3 使用Northwind数据源演示查询操作318

13.4 投影操作符与过滤操作符318

13.4.1 Select整个表318

13.4.2 Select部分列319

13.4.3 Select结合Lambda表达式320

13.4.4 使用where进行过滤320

13.4.5 SelectMany321

13.4.6 Distinct324

13.5 排序操作符325

13.6 分组操作符325

13.7 通过Let声明局部变量328

13.8 连接操作符329

13.8.1 使用join子句的内连接330

13.8.2 使用join into子句进行外连接330

13.9 其他常用的操作符331

13.10 延迟执行333

13.11 查询表达式和方法语法335

13.12 本章小结336

13.13 思考题336

第14章 LINQ to SQL337

14.1 IQueryable337

14.2 IQueryable与IEnumerable的异同338

14.3 数据库操作339

14.3.1 弱类型实体集339

14.3.2 Entity Framework340

14.3.3 Repository模式342

14.4 使用LINQ to Entity Framework342

14.4.1 Database First342

14.4.2 Model First346

14.4.3 Code First347

14.5 表达式树转化为SQL348

14.5.1 准备工作349

14.5.2 实现IQueryable〈T〉351

14.5.3 实现IQueryProvider352

14.5.4 测试IQueryable的运行流程354

14.5.5 表达式查看器355

14.5.6 第一步:解析Where表达式355

14.5.7 第二步:解析Where Lambda表达式357

14.5.8 表达式树转化为SQL的总结360

14.6.LINQ与EF的性能问题361

14.6.1 避免Select N+1361

14.6.2 避免重复枚举同一序列362

14.6.3 避免毫无必要地枚举整个序列363

14.6.4 Entity Framework的预热364

14.6.5 AsNoTracking方法365

14.6.6 简化传入字符串排序的代码365

14.7 LINQ to Rx370

14.7.1 事件流序列操作LINQ化371

14.7.2 事件的限流372

14.7.3 本质:推模型和拉模型373

14.8 本章小结373

14.9 思考题374

第15章 动态语言运行时375

15.1 dynamic关键字简介375

15.1.1 动态类型简化晚期绑定376

15.1.2 动态类型简化COM互操作378

15.1.3 动态类型相比泛型更加灵活379

15.1.4 使用ExpandoObject创建动态类型380

15.1.5 动态类型的好处381

15.1.6 动态类型的限制381

15.2 动态类型的原理382

15.2.1 调用点382

15.2.2 使用C# object类型模拟动态类型383

15.2.3 建立调用点384

15.2.4 初始化调用点384

15.2.5 使用调用点的目标385

15.2.6 DLR的缓存策略386

15.3 本章小结387

15.4 思考题387

第16章 C# 6与C# 7的重要特性388

16.1 C# 6的主要特性388

16.1.1 自动属性的再次进化388

16.1.2 简易函数表达式写法390

16.1.3 字符串插值392

16.1.4 使用static using调用静态类方法392

16.1.5 判定null的简写操作符?393

16.1.6 异常过滤394

16.1.7 nameof运算符394

16.2 C# 7的主要特性395

16.2.1 数字字面量395

16.2.2 改进的out关键字396

16.2.3 模式匹配397

16.2.4 C# 7的值类型元组399

16.2.5 解构402

16.2.6 局部函数405

16.2.7 引用返回值和引用局部变量410

16.2.8 更多的表达式体成员414

16.2.9 在更多的地方抛出异常415

16.2.10 具有值类型的引用语义415

16.3 C# 8前瞻416

16.4 本章小结417

16.5 思考题417

第三部分 多线程和异步420

第17章 多线程概念420

17.1 进程和线程420

17.1.1 操作系统简单发展史420

17.1.2 进程421

17.1.3 进程调度424

17.1.4 进程的上下文切换424

17.1.5 线程425

17.1.6 单核CPU多线程是否能够提高性能428

17.2 .NET中的进程与应用程序域428

17.2.1 .NET中的进程(托管进程)428

17.2.2 进程间通信428

17.2.3 使用剪贴板实现进程间通信429

17.2.4 应用程序域431

17.3 .NET中的线程(托管线程)与Thread类的基本使用432

17.3.1 创建线程433

17.3.2 线程命名433

17.3.3 前台线程和后台线程434

17.3.4 线程的状态435

17.3.5 向线程传递数据437

17.3.6 异常处理438

17.4 线程池439

17.4.1 线程池是如何管理线程的439

17.4.2 线程池的线程调度策略440

17.4.3 使用线程池:显式操作441

17.4.4 使用线程池:异步委托442

17.4.5 使用线程池:通过任务442

17.5 线程局部存储区(TLS)443

17.5.1 使用[ThreadStatic]特性443

17.5.2 使用Thread类上的两个方法:GetData和SetData444

17.5.3 使用ThreadLocal〈T〉445

17.6 本章小结446

17.7 思考题447

第18章 多线程同步448

18.1 多线程同步的概念448

18.2 锁:基元构造455

18.3 用户模式构造456

18.3.1 同步问题的提出456

18.3.2 JIT优化、有序性和指令重排457

18.3.3 C#的内存模型459

18.3.4 可见性、有序性、内存栅栏与volatile关键字460

18.3.5 避免使用volatile464

18.3.6 互锁构造465

18.3.7 Interlocked Anything模式466

18.3.8 使用用户模式构造的例子467

18.3.9 实现自旋锁468

18.3.10 SpinLock469

18.4 内核模式构造470

18.4.1 通过WaitHandle操作内核对象471

18.4.2 事件构造472

18.4.3 信号量构造477

18.4.4 使用信号量实现锁478

18.4.5 互斥量构造478

18.4.6 基元构造锁总结479

18.5 锁:混合构造480

18.5.1 一个简单的混合锁481

18.5.2 优化DIY混合锁:使锁支持递归和自旋482

18.5.3 最常用的锁:Monitor的工作原理484

18.5.4 Monitor的递归调用485

18.5.5 如何选择同步对象486

18.6 .NET 4中新增的轻量级同步工具488

18.6.1 ManualResetEventSlim和SemaphoreSlim类489

18.6.2 ReaderWriterLockSlim类489

18.7 这么多锁:总结491

18.8 线程安全的集合类491

18.9 本章小结494

18.10 思考题494

第19章 .NET 4之前的异步编程495

19.1 基本概念495

19.2 使用System.Threading进行异步编程497

19.2.1 耗时任务497

19.2.2 最简单的异步编程497

19.2.3 获得执行结果498

19.2.4 实现回调函数获得执行结果499

19.2.5 线程统一取消模型500

19.2.6 总结504

19.3 基于委托的异步编程模型505

19.3.1 APM的设计规范505

19.3.2 获得异步委托的执行结果506

19.3.3 System.IAsyncResult接口507

19.3.4 通过回调的方式获得异步委托的执行结果508

19.3.5 使用线程统一取消模型进行取消509

19.3.6 捕获异步编程的异常511

19.3.7 GUI的线程处理模型512

19.3.8 GUI中使用委托进行异步——Control.Begin-Invoke原理513

19.3.9 GUI中使用委托进行异步——WinForm程序示例515

19.3.10 总结517

19.4 基于事件的异步编程模式518

19.4.1 EAP的设计规范518

19.4.2 BackgroundWorker类简介519

19.4.3 GUI中使用EAP进行异步——WPF程序示例521

19.4.4 总结525

19.5 我们需要这么多异步编程的方法吗525

19.6 本章小结525

19.7 思考题526

第20章 任务并行库527

20.1 任务并行库527

20.2 使用任务进行异步编程528

20.2.1 新建任务528

20.2.2 任务的状态529

20.2.3 任务调度器530

20.2.4 任务工厂531

20.3 获得任务的执行结果532

20.3.1 等待任务完成532

20.3.2 任务连接作为回调函数533

20.3.3 使用过去的方式539

20.4 任务的异常处理539

20.4.1 父子任务中的异常处理(附加子任务)541

20.4.2 父子任务中的异常处理(分离子任务)541

20.5 任务的取消544

20.5.1 直接退出任务544

20.5.2 利用ThrowIfCancellation-Requested方法545

20.5.3 任务取消的异常处理545

20.5.4 任务异常处理:总结548

20.6 在WPF中使用任务549

20.7 并行编程与PLINQ552

20.8 Parallel类553

20.8.1 Parallel.Invoke与任务并行554

20.8.2 Parallel.For/ForEach与数据并行555

20.8.3 收集任务的执行结果558

20.8.4 指定最大并行度558

20.8.5 在Parallel类中捕捉异常559

20.8.6 使用ParallelOption取消并行任务560

20.8.7 使用ParallelLoopState退出For/ForEach循环562

20.8.8 Parallel方法的取消与异常处理总结563

20.9 PLINQ564

20.9.1 指定执行模式566

20.9.2 指定并行度567

20.9.3 PLINQ与排序567

20.9.4 PLINQ的数据分区策略568

20.9.5 PLINQ的输出端与结果收集策略571

20.9.6 使用Aggregate的并行版本进行计算572

20.9.7 取消PLINQ查询572

20.9.8 在PLINQ中捕捉异常573

20.9.9 总结:是否需要使用PLINQ574

20.10 Lazy〈T〉和延迟初始化574

20.11 本章小结576

20.12 思考题576

第21章 .NET 4.5 异步编程实例577

21.1 初识async/await577

21.1.1 异步方法的执行流程579

21.1.2 异步方法的异常处理582

21.1.3 异步方法的取消584

21.1.4 调用方法获得结果的几种方式585

21.1.5 async和await总结587

21.2 了解async/await的原理588

21.2.1 示例程序588

21.2.2 使用ILSpy反编译589

21.2.3 状态机结构589

21.2.4 骨架方法594

21.2.5 异常处理595

21.3 GUI:使用async和await关键字进行异步操作595

21.3.1 异步操作的基本模型596

21.3.2 使用WhenAll等待一组任务完成597

21.3.3 使用WhenAny等待任意一个任务完成598

21.3.4 任务完成时的处理599

21.4 可等待模式600

21.4.1 定义600

21.4.2 await anything601

21.5 本章小结603

21.6 思考题604

后记605

附录 程序员面试流程概览606

热门推荐