首页>参考读物>计算机科学与技术>软件与程序设计

C# 7.0本质论(英文版)
作者 : [美] 马克·米凯利斯(Mark Michaelis) 著
丛书名 : 经典原版书库
出版日期 : 2019-02-26
ISBN : 978-7-111-61898-0
定价 : 169.00元
扩展资源下载
扩展信息
语种 : 英文
页数 : 966
开本 : 16
原书名 : Essential C# 7.0
原出版社: Pearson Education Inc.
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

作为历年来深受各层次开发人员欢迎的C#权威指南,本书讨论了从C# 3.0到7.0的最重要的C#特性,强调了现代编程模式,可帮助读者编写简洁、强大、健壮、安全和易于维护的C#代码。世界级C#专家Mark Michaelis对语言进行了全面而深入的探讨,提供了对关键C# 7.0增强、C# 7.0和.NET Core/.NET Standard的配合使用以及跨平台编译的专业论述。

图书特色

WU

图书前言

在软件工程的发展历史中,用于编写计算机程序的方法经历了几次思维模式的重大转变。每种思维模式都以前一种为基础,宗旨都是增强代码的组织,并降低复杂性。本书将带领你体验相同的思维模式转变过程。
本书开始几章会指导你学习顺序编程结构。在这种编程结构中,语句按编写顺序执行。该结构的问题在于,随着需求的增加,复杂性也指数级增加。为降低复杂性,将代码块转变成方法,产生了结构化编程模型。在这种模型中,可以从一个程序中的多个位置调用同一个代码块,不需要复制。但即使有这种结构,程序还是会很快变得臃肿不堪,需进一步抽象。所以,在此基础上人们又提出了面向对象编程的概念,这将在第6章开始讨论。在此之后,你将继续学习其他编程方法,比如基于接口的编程和LINQ(以及它促使集合API发生的改变),并最终学习通过特性(attribute)进行初级的声明性编程(第18章)。
本书有以下三个主要职能。
全面讲述C#语言,其内容已远远超过了一本简单的教程,为你进行高效率软件开发打下坚实基础。
对于已熟悉C#的读者,本书探讨了一些较为复杂的编程思想,并深入讨论了语言最新版本(C# 7.0和.NET Framework 4.7/.NET Core 2.0)的新功能。
它是你永远的案头参考—即便在你精通了这种语言之后。
成功学习C#的关键在于,要尽可能快地开始编程。不要等自己成为一名理论“专家”之后才开始写代码。所以不要犹豫,马上开始写程序吧。作为迭代开发思想的追随者,我希望即使一名刚开始学习编程的新手,在第2章结束时也能动手写基本的C#代码。
许多主题本书没有讨论。你在本书中找不到ASP.NET、ADO.NET、Xamarin、智能客户端开发以及分布式编程等主题。虽然这些主题与.NET有关,但它们都值得用专门的书分专题讲述。幸好市面上已经有丰富的图书供读者选择。本书重点在于C#及基类库中的类型。读完本书之后,你在上述任何领域继续深入学习都会有游刃有余的感觉。
本书面向的读者
写作本书时,我面临的一个挑战是如何在持续吸引高级开发人员眼球的同时,不因使用assembly、link、chain、thread和fusion等字眼而打击初学者的信心,否则许多人会以为这是一本讲冶金而不是程序设计的书。 本书的主要读者是已经有一定编程经验,并想多学一种语言来“傍身”的开发者。但我还是小心地编排了本书的内容,使之对各种层次的开发者都有足够大的价值。
初学者:假如你是编程新手,本书将帮助你从入门级程序员过渡为C#开发者,消除以后在面临任何C#编程任务时的害怕心理。本书不仅要教会你语法,还要教你养成良好的编程习惯,为将来的编程生涯打下良好基础。
熟悉结构化编程的程序员:学习外语最好的方法就是“沉浸法”。类似地,学习一门计算机语言最好的方法就是在动手中学习,而不是等熟知了它的所有“理论”之后再动手。基于这个前提,本书最开始的内容是那些熟悉结构化编程的开发者很容易上手的。到第5章结束时,这些开发者应该可以开始写基本的控制流程序。然而,要成为真正的C#开发者,记住语法只是第一步。为了从简单程序过渡到企业级开发,C#开发者必须熟练从对象及其关系的角度来思考问题。为此,第6章的“初学者主题”开始介绍类和面向对象开发。历史上的C、COBOL和FORTRAN等结构化编程语言虽然仍在发挥作用,但作用会越来越小,所以,软件工程师们应该逐渐开始了解面向对象开发。C#是进行这一思维模式转变的理想语言,因为它本来就是基于“面向对象开发”这一中心思想来设计的。
熟悉“基于对象”和“面向对象”理念的开发者:C++、Python、TypeScript、Visual Basic和Java程序员都可归于此类。对于分号和大括号,他们可是一点儿都不陌生!简单浏览一下第1章的代码,你会发现,从核心上讲,C#类似于你熟知的C和C++风格的语言。
C#专家:对于已经精通C#的读者,本书可供你参考不太常见的语法。此外,对于在其他地方强调较少的一些语言细节以及微妙之处,我提出了自己的见解。最重要的是,本书提供了编写可靠和易维护代码的指导原则及模式。在你教别人学C#时,本书也颇有助益。从C# 3.0到C# 7.0最重要的一些增强包括:
字符串插值(第2章)
隐式类型的变量(第3章)
元组(第3章)
模式匹配(第4章)
扩展方法(第6章)
分部方法(第6章)
泛型(第12章)
Lambda语句和表达式(第13章)
表达式树(第13章)
匿名类型(第15章)
标准查询操作符(第15章)
查询表达式(第16章)
动态编程(第18章)
用任务编程库(TPL)和async进行多线程编程(第19章)
用PLINQ进行并行查询处理(第19章)
并发集合(第20章)
考虑到许多人还不熟悉这些主题,本书围绕它们展开了详细的讨论。涉及高级C#开发的还有“指针”这一主题,该主题将在第21章讨论。即使是有经验的C#开发者,也未必能很透彻地理解这一主题。
本书特色
本书是语言参考书,遵循核心《C#语言7.0规范》(C# Language 7.0 Specification)。为了帮助读者理解各种C#构造,书中用大量例子演示了每一种特性,而且为每个概念都提供了相应的指导原则和最佳实践,以确保代码能顺利编译,避免留下隐患,并获得最佳的可维护性。
为增强可读性,所有代码均进行了特殊格式处理,而且每章内容都用思维导图来概括。
C#设计规范
本书新版本最重大的改进之一就是增加了大量“设计规范”,下面是取自第17章的例子。
设计规范
要确保相等的对象有相等的散列码。
要确保对象在散列表中时散列码永不变化。
要确保散列算法快速生成良好分布的散列码。
要确保散列算法在任何可能的对象状态中的健壮性。
区分知道语法的程序员和能因地制宜写出最高效代码的专家的关键就是这些设计规范。专家不仅能让代码通过编译,还会遵循最佳实践,降低出现bug的概率,并使代码的维护变得更容易。设计规范强调了一些关键原则,开发时务必注意。
示例代码
本书大多数代码都能在公共语言基础结构(Common Language Infrastructure,CLI)的任何实现上运行,但重点还是Microsoft .NET Framework和.NET Core这两个实现。很少使用平台或厂商特有的库,除非需要解释只和那些平台相关的重要概念(例如,解释如何正确处理Windows单线程UI)。
下面是一个示例代码清单。
代码清单1-19 注释代码

下面解释具体的格式:
注释使用斜体。

关键字加粗。

有的代码突出显示,是为了指出这些代码与之前的有区别,或是为了演示正文介绍的概念。

突出显示的可能是一整行,也可能是一行中的几个字符。

省略号表示无关代码已省略。

代码清单后列出了对应的控制台输出。由用户输入的内容加粗。
输出1-7

虽然我也可以在书中提供完整代码以方便复制,但这样会分散大家的注意力。因此,你需要在自己的程序中修改示例代码。书中的代码主要省略了错误检查,比如异常处理。另外,代码没有显式包含using System语句,所有例子都需要该语句。
请访问https://github.com/IntelliTect/EssentialCSharp或http://bookzhou.com下载示例代码。
思维导图
每章开头都有一幅“思维导图”作为提纲,目的是为读者提供针对每章内容的快速参考。下面是一个例子(摘自第6章)。

每章主题显示在思维导图的中心,高级主题围绕中心展开。利用思维导图,读者可方便地搭建自己的知识体系,可以从一个主题出发,更清楚地理解其周边的各个具体概念,避免中途纠缠于一些不相干的枝节问题。
分类解说
根据编程水平的不同,可以利用书中的标志来帮助自己轻松找到适合自己的内容。
初学者主题:特别针对入门级程序员提供的定义或解释。
高级主题:可以让有经验的开发者将注意力放在他们最关心的内容上。
标注:用有底纹的标注框强调关键点,引起读者的注意。
语言对比:分散在正文中的补充内容描述了C#和其他语言的关键差异,为熟悉其他语言的读者提供指引。
本书内容组织
总体来说,软件工程的宗旨就是管理复杂性。本书基于该宗旨来组织内容。第1章~第5章介绍结构化编程,学习这些内容后,可以立即开始写一些功能简单的代码。第6章~第10章介绍C#的面向对象构造,新手应在完全理解这几章的内容之后,再开始接触本书其余部分更高级的主题。第12章~第14章介绍更多用于降低复杂性的构造,讲解当今几乎所有程序都要用到的通用设计模式。理解了它们之后,才可以更轻松地理解如何通过反射和特性来进行动态编程。后续章节将广泛运用它们来实现线程处理和互操作性。
本书最后专门用一章(第22章)讲解CLI。这一章在开发平台的背景下对C#语言进行了描述。之所以要放到最后,是因为它非C#特有,且不涉及语法和编程风格问题。不过,本章适合在任何时候阅读,或许最恰当的时机是在阅读完第1章之后。
下面是每一章的内容提要。(加黑的标题表明那一章含有C# 6.0和C# 7.0的内容。)
第1章—C#概述:本章在展示了用C#写的HelloWorld程序之后对其进行细致分析。目的是让读者熟悉C#程序的“外观和感觉”,并理解如何编译和调试自己的程序。另外,还简单描述了执行C#程序的上下文及其中间语言(intermediate language,IL)。
第2章—数据类型:任何有用的程序都要处理数据,本章介绍了C#的基元数据类型。
第3章—更多数据类型:本章深入讲解数据类型的两大类别:值类型和引用类型。然后讲解了可空修饰符以及C# 7.0引入的元组。最后深入讨论了基元数组结构。
第4章—操作符和控制流:计算机最擅长重复性操作,为利用该能力,需知道如何在程序中添加循环和条件逻辑。本章还讨论了C#操作符、数据转换和预处理器指令。
第5章—方法和参数:本章讨论了方法及其参数的细节,其中包括通过参数来传值、传引用和通过out参数返回数据。C# 4.0新增了默认参数,本章将解释如何使用。
第6章—类:前面已学过类的基本构成元素,本章合并这些构造,以获得具有完整功能的类型。类是面向对象技术的核心,它定义了对象模板。
第7章—继承:继承是许多开发者的基本编程手段,C#更是提供了一些独特构造,比如new修饰符。本章讨论了继承语法的细节,其中包括重写(overriding)。
第8章—接口:本章讨论如何利用接口来定义类之间的“可进行版本控制的交互契约”(versionable interaction contract)。C#同时包含显式和隐式接口成员实现,可实现一个额外的封装等级,这是其他大多数语言所不支持的。
第9章—值类型:尽管不如定义引用类型那么频繁,但有时确有必要定义行为和C#内置基元类型相似的值类型。本章介绍如何定义结构(struct),同时也强调其特殊性。
第10章—合式类型:本章讨论了更高级的类型定义,解释如何实现操作符,比如+和转型操作符,并描述如何将多个类封装到一个库中。此外,还演示了如何定义命名空间和XML注释,并讨论如何基于垃圾回收机制来设计令人满意的类。
第11章—异常处理:本章延伸讨论第5章引入的异常处理机制,描述了如何利用异常层次结构创建自定义异常。此外,还强调了异常处理的一些最佳实践。
第12章—泛型:泛型或许是C# 1.0最缺少的功能。本章全面讨论自2.0引入的泛型机制。此外,C# 4.0增加了对协变和逆变的支持,本章将在泛型背景中探讨它们。
第13章—委托和Lambda表达式:正因为委托,才使C#与其前身语言(C和C++等)有了显著不同,它定义了在代码中处理事件的模式。这几乎完全消除了写轮询例程的必要。Lambda表达式是使C# 3.0的LINQ成为可能的关键概念。通过学习本章,你将知道Lambda表达式是在委托的基础上构建起来的,它提供了比委托更优雅和简洁的语法。本章内容是第14章讨论的新的集合API的基础。本章还强调了匿名方法应该用新的Lambda表达式代替。
第14章—事件:封装起来的委托(称为事件)是公共语言运行时(Common Language Runtime,CLR)的核心构造。
第15章—支持标准查询操作符的集合接口:通过讨论新的Enumerable类的扩展方法,介绍C# 3.0引入的一些简单而强大的改变。Enumerable类造就了全新的集合API,即“标准查询操作符”,本章对其进行详细讨论。
第16章—使用查询表达式的LINQ:如果只使用标准查询操作符,会形成让人难以辨认的长语句。查询表达式提供了一种类似SQL风格的语法,有效解决了该问题。本章会详细讨论这种表达式。
第17章—构建自定义集合:构建用于操纵业务对象的自定义API时,经常需要创建自定义集合。本章讨论了具体做法,还介绍了能使自定义集合的构建变得更简单的上下文关键字。
第18章—反射、特性和动态编程:20世纪80年代末,程序结构的思维模式发生了根本性的变化,面向对象的编程是这个变化的基础。类似地,特性(attribute)使声明性编程和嵌入元数据成为可能,因而引入了一种新的思维模式。本章探讨了特性的方方面面,并讨论了如何通过反射机制来获取它们。本章还讨论了如何通过基类库(Base Class Library,BCL)中的序列化框架来实现文件的输入输出。C# 4.0新增了dynamic关键字,能将所有类型检查都移至运行时进行,因而极大地扩展了C#的能力。
第19章—多线程处理:大多数现代程序都要求用线程执行长时间运行的任务,同时确保对并发事件的快速响应。随着程序越来越复杂,必须采取其他措施来保护这些高级环境中的数据。多线程应用程序的编写比较复杂。本章讨论了如何操纵线程,并提供一些最佳实践来避免将多线程应用程序弄得一团糟。
第20章—线程同步:本章以第19章为基础,演示如何利用一些内建线程处理模式来简化对多线程代码的显式控制。
第21章—平台互操作性和不安全的代码:必须意识到C#是相对年轻的一种语言,许多现有的代码是用其他语言写成的。为了用好这些现有代码,C#通过P/Invoke提供了对互操作性(调用非托管代码)的支持。此外,C#允许使用指针,也允许执行直接内存操作。虽然使用了指针的代码要求特殊权限才能运行,但它具有与C风格的API完全兼容的能力。
第22章—公共语言基础结构(CLI):事实上,C#被设计成一种在CLI顶部工作的最有效的编程语言。本章讨论了C#程序与底层“运行时”及其规范的关系。
—Mark Michaelis
IntelliTect.com/mark
Twitter: @Intellitect, @MarkMichaelis

上架指导

计算机\程序设计

封底文字

“Mark非常聪明,善于打破砂锅问到底,能深刻理解一种技术对于真正的开发人员的影响……他的文字直指技术的本质,敏锐地指出技术的真正价值和问题……没人能像这位大师一样帮你正确理解C# 7.0。”
——Mads Torgersen,微软公司C# 项目经理
全面且专业的C#编程指南
作为历年来深受各层次开发人员欢迎的C#指南,本书讨论了从C# 3.0到C# 7.0中最重要的C#特性,强调了现代编程模式,教你如何编写简洁、强大、健壮、安全且易于维护的C#代码。
世界级C#专家Mark Michaelis对C#语言进行了全面而深入的探讨,提供了针对关键C# 7.0增强、C# 7.0和.NET Core/.NET Standard的配合使用以及跨平台编译的专业论述。他用简洁的例子阐释了关键C#构造,并提供了大量优秀实践编程规范,为你进行高效软件开发打好基础。

本书包括以下内容:
•深挖C# 7.0的诸多改进,包括元组、解构函数、模式匹配、本地函数和ref返回等
•利用C#面向对象构造写出更健壮的代码
•利用泛型、委托、Lambda表达式和事件降低代码复杂度
•利用C# 7.0跨平台编译在Linux或MacOS上运行代码
•全面掌握多线程处理和同步,包括async/await模式
•包括C# 7.1/7.2/7.3语言增强
作者简介
Mark Michaelis是高端软件工程和咨询公司IntelliTect的创办者、首席技术架构师和培训师。从1996年起,他一直是C#和相关技术的微软MVP。他服务于微软公司的几个C#软件设计评审团队,经常在开发者大会上发言,并为《MSDN Magazine》撰写《Essential .NET》专栏。
作者简介
Mark Michaelis 是高端软件工程和咨询公司IntelliTect的创办者、首席技术架构师和培训师。从1996年起,他一直是C#和相关技术的微软MVP。他服务于微软公司的几个C#软件设计评审团队,经常在开发者大会上发言,并为《MSDN Magazine》撰写《Essential .NET》专栏。

图书目录

第1章 C#概述 1
1.1 Hello, World 2
1.2 C#语法基础 11
1.3 使用变量 20
1.4 控制台输入和输出 24
1.5 注释 28
1.6 托管执行和CLI 32
1.7 多个.NET框架 37
第2章 数据类型 43
2.1 基本数值类型 44
2.2 更多基本类型 53
2.3 null和void 67
2.4 数据类型转换 69
第3章 更多数据类型 77
3.1 类型的划分 77
3.2 可空修饰符 80
3.3 元组 83
3.4 数组 90
第4章 操作符和控制流程 109
4.1 操作符 110
4.2 控制流程概述 126
4.3 代码块 132
4.4 代码块、作用域和声明空间 135
4.5 布尔表达式 137
4.6 按位操作符 147
4.7 控制流程语句(续) 153
4.8 跳转语句 165
4.9 C#预处理器指令 171
第5章 方法和参数 181
5.1 调用方法 182
5.2 声明方法 189
5.3 using指令 195
5.4 Main()的返回值和参数 200
5.5 高级方法参数 203
5.6 递归 215
5.7 方法重载 217
5.8 可选参数 220
5.9 用异常实现基本错误处理 225
第6章 类 241
6.1 类的声明和实例化 245
6.2 实例字段 249
6.3 实例方法 251
6.4 使用this关键字 252
6.5 访问修饰符 259
6.6 属性 261
6.7 构造函数 278
6.8 静态成员 289
6.9 扩展方法 299
6.10 封装数据 301
6.11 嵌套类 304
6.12 分部类 307
第7章 继承 313
7.1 派生 314
7.2 重写基类 326
7.3 抽象类 338
7.4 所有类都从System.Object派生 344
7.5 使用is操作符验证基础类型 345
7.6 使用is操作符进行模式匹配 346
7.7 switch语句中的模式匹配 347
7.8 使用as操作符进行转换 349
第8章 接口 353
8.1 接口概述 354
8.2 通过接口实现多态性 355
8.3 接口实现 360
8.4 在实现类和接口之间转换 366
8.5 接口继承 366
8.6 多接口继承 369
8.7 接口上的扩展方法 369
8.8 通过接口实现多继承 371
8.9 版本控制 374
8.10 比较接口和类 375
8.11 比较接口和特性 377
第9章 值类型 379
9.1 结构 383
9.2 装箱 390
9.3 枚举 398
第10章 合式类型 411
10.1 重写object的成员 411
10.2 操作符重载 424
10.3 引用其他程序集 432
10.4 定义命名空间 442
10.5 XML注释 445
10.6 垃圾回收 449
10.7 资源清理 452
10.8 推迟初始化 461
第11章 异常处理 465
11.1 多异常类型 465
11.2 捕捉异常 469
11.3 常规catch块 473
11.4 异常处理规范 475
11.5 自定义异常 479
11.6 重新抛出包装的异常 483
第12章 泛型 487
12.1 如果C#没有泛型 488
12.2 泛型类型概述 493
12.3 约束 506
12.4 泛型方法 519
12.5 协变性和逆变性 524
12.6 泛型的内部机制 531
第13章 委托和Lambda表达式 537
13.1 委托概述 538
13.2 声明委托类型 542
13.3 Lambda表达式 550
13.4 匿名方法 556
第14章 事件 575
14.1 使用多播委托编码Publish-Subscribe模式 576
14.2 理解事件 591
第15章 支持标准查询操作符的集合接口 603
15.1 集合初始化器 604
15.2 IEnumerable使类成为集合 607
15.3 标准查询操作符 613
15.4 匿名类型之于LINQ 646
第16章 使用查询表达式的LINQ 657
16.1 查询表达式概述 658
16.2 查询表达式只是方法调用 676
第17章 构建自定义集合 679
17.1 更多集合接口 680
17.2 主要集合类 683
17.3 提供索引器 702
17.4 返回null或者空集合 705
17.5 迭代器 705
第18章 反射、特性和动态编程 721
18.1 反射 722
18.2 特性 735
18.3 使用动态对象进行编程 759
第19章 多线程处理 771
19.1 多线程处理基础 774
19.2 使用System.Threading 781
19.3 异步任务 789
19.4 取消任务 810
19.5 基于任务的异步模式 816
19.6 并行迭代 846
19.7 并行执行LINQ查询 856
第20章 线程同步 863
20.1 线程同步的意义 864
20.2 计时器 893
第21章 平台互操作性和不安全代码 897
21.1 平台调用 898
21.2 指针和地址 910
21.3 通过委托执行不安全代码 920
第22章 公共语言基础结构(CLI) 923
22.1 CLI的定义 924
22.2 CLI的实现 925
22.3 .NET标准 928
22.4 BCL 929
22.5 C#编译成机器码 929
22.6 运行时 932
22.7 程序集、清单和模块 936
22.8 公共中间语言 939
22.9 公共类型系统 939
22.10 公共语言规范 940
22.11 元数据 941
22.12 NET Native和AOT编译 942


Contents
1 Introducing C# 1
Hello, World 2
C# Syntax Fundamentals 11
Working with Variables 20
Console Input and Output 24
Commne ts 28
Managed Execution and the Common Language Infrastructure 32
Multiple .NET Frameworks 37
2 Data Types 43Fundamental Numeric Types 44
More Fundamental Types 53
null and void 67
Conversions between Data Types 69
3 More with Data Types 77
Categories of Types 77
Nullable Modifier 80
Tuples 83
Arrays 90
4 Operators and Control Flow 109
Operators 110
Introducing Flow Control 126
Code Blocks ({}) 132
Code Blocks, Scopes, and Declaration Spaces 135
Boolean Expressions 137
Bitwise Operators (<<, >>, |, &, ^, ~) 147
Control Flow Statements, Continued 153
Jump Statements 165
C# Preprocessor Directives 171
5 Methods and Parameters 181
Calling a Method 182
Declaring a Method 189
The using Directive 195
Returns and Parameters on Main() 200
Advanced Method Parameters 203
Recursion 215
Method Overloading 217
Optional Parameters 220
Basic Error Handling with Exceptions 225
6 Classes 241
Declaring and Instantiating a Class 245
Instance Fields 249
Instance Methods 251
Using the this Keyword 252
Access Modifiers 259
Properties 261
Constructors 278
Static Members 289
Extension Methods 299
Encapsulating the Data 301
Nested Classes 304
Partial Classes 307
7 Inheritance 313
Derivation 314
Overriding the Base Class 326
Abstract Classes 338
All Classes Derive from System.Object 344
Verifying the Underlying Type with the is Operator 345
Pattern Matching with the is Operator 346
Pattern Matching within a switch Statement 347
Conversion Using the as Operator 349
8 Interfaces 353
Introducing Interfaces 354
Polymorphism through Interfaces 355
Interface Implementation 360
Converting between the Implementing Class and Its Interfaces 366
Interface Inheritance 366
Multiple Interface Inheritance 369
Extension Methods on Interfaces 369
Implementing Multiple Inheritance via Interfaces 371
Versioning 374
Interfaces Compared with Classes 375
Interfaces Compared with Attributes 377
9 Value Types 379
Structs 383
Boxing 390
Enums 398
10 Well-Formed Types 411
Overriding object Members 411
Operator Overloading 424
Referencing Other Assemblies 432
Defining Namespaces 442
XML Comments 445
Garbage Collection 449
Resource Cleanup 452
Lazy Initialization 461
11 Exception Handling 465
Multiple Exception Types 465
Catching Exceptions 469
General Catch Block 473
Guidelines for Exception Handling 475
Defining Custom Exceptions 479
Rethrowing a Wrapped Exception 483
12 Generics 487
C# without Generics 488
Introducing Generic Types 493
Constraints 506
Generic Methods 519
Covariance and Contravariance 524
Generic Internals 531
13 Delegates and Lambda Expressions 537
Introducing Delegates 538
Declaring Delegate Types 542
Lambda Expressions 550
Anonymous Methods 556
14 Events 575
Coding the Publish-Subscribe Pattern with Multicast Delegates 576
Understanding Events 591
15 Collection Interfaces with Standard Query Operators 603
Collection Initializers 604
What Makes a Class a Collection: IEnumerable 607
Standard Query Operators 613
Anonymous Types with LINQ 646
16 LINQ with Query Expressions 657
Introducing Query Expressions 658
Query Expressions Are Just Method Invocations 676
17 Building Custom Collections 679
More Collection Interfaces 680
Primary Collection Classes 683
Providing an Indexer 702
Returning Null or an Empty Collection 705
Iterators 705
18 Reflection, Attributes, and Dynamic Programming 721
Reflection 722
Attributes 735
Programming with Dynamic Objects 759
19 Multithreading 771
Multithreading Basics 774
Working with System.Threading 781
Asynchronous Tasks 789
Canceling a Task 810
The Task-based Asynchronous Pattern 816
Executing Loop Iterations in Parallel 846
Running LINQ Queries in Parallel 856
20 Thread Synchronization 863
Why Synchronization? 864
Timers 893
21 Platform Interoperability and Unsafe Code 897
Platform Invoke 898
Pointers and Addresses 910
Executing Unsafe Code via a Delegate 920
22 The Common Language Infrastructure 923
Defining the Common Language Infrastructure 924
CLI Implementations 925
.NET Standard 928
Base Class Library 929
C# Compilation to Machine Code 929
Runtime 932
Assemblies, Manifests, and Modules 936
Common Intermediate Language 939
Common Type System 939
Common Language Specification 940
Metadata 941
.NET Native and Ahead of Time Compilation 942

教学资源推荐
作者: [美]基普·欧文(Kip Irvine) 著
作者: (英)Roger Garside, John Mariani
作者: 杨树林 胡洁萍 编著
作者: 苏运霖